1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Copyright (c) 2023, STMicroelectronics 4 */ 5 #ifndef DRIVERS_REGULATOR_H 6 #define DRIVERS_REGULATOR_H 7 8 #include <assert.h> 9 #include <bitstring.h> 10 #include <kernel/mutex.h> 11 #include <sys/queue.h> 12 #include <tee_api_types.h> 13 #include <stdbool.h> 14 #include <stdint.h> 15 #include <util.h> 16 17 /* Regulator property flags: related to device tree binding properties */ 18 19 /* Regulator should never be disabled. DT property: regulator-always-on */ 20 #define REGULATOR_ALWAYS_ON BIT(0) 21 22 #define REGULATOR_FLAGS_MASK REGULATOR_ALWAYS_ON 23 24 struct regulator_ops; 25 26 /* 27 * struct regulator - A regulator instance 28 * @ops: Operation handlers for the regulator 29 * @supply: Regulator supply reference or NULL if none 30 * @priv: Regulator driver private data 31 * @name: Regulator string name for debug purpose or NULL 32 * @min_uv: Min possible voltage level in microvolt (uV) 33 * @max_uv: Max possible voltage level in microvolt (uV) 34 * @cur_uv: Current voltage level in microvolt (uV) 35 * @flags: REGULATOR_* property flags 36 * @refcount: Regulator enable request reference counter 37 * @lock: Mutex for concurrent access protection 38 * @link: Link in initialized regulator list 39 */ 40 struct regulator { 41 /* Fields initialized by caller of regulator_register() */ 42 const struct regulator_ops *ops; 43 struct regulator *supply; 44 void *priv; 45 char *name; 46 int min_uv; 47 int max_uv; 48 /* Fields internal to regulator framework */ 49 int cur_uv; 50 unsigned int flags; 51 unsigned int refcount; 52 struct mutex lock; /* Concurrent access protection */ 53 SLIST_ENTRY(regulator) link; 54 }; 55 56 /* 57 * struct regulator_ops - Regulator operation handlers 58 * 59 * @set_state: Enable or disable a regulator 60 * @get_state: Get regulator effective state 61 * @set_voltage: Set voltage level in microvolt (uV) 62 * @get_voltage: Get current voltage in microvolt (uV) 63 */ 64 struct regulator_ops { 65 TEE_Result (*set_state)(struct regulator *r, bool enabled); 66 TEE_Result (*get_state)(struct regulator *r, bool *enabled); 67 TEE_Result (*set_voltage)(struct regulator *r, int level_uv); 68 TEE_Result (*get_voltage)(struct regulator *r, int *level_uv); 69 }; 70 71 #ifdef CFG_DRIVERS_REGULATOR 72 /* 73 * regulator_enable() - Enable regulator 74 * @regulator: Regulator reference 75 */ 76 TEE_Result regulator_enable(struct regulator *regulator); 77 78 /* 79 * regulator_disable() - Disable regulator 80 * @regulator: Regulator reference 81 */ 82 TEE_Result regulator_disable(struct regulator *regulator); 83 84 /* 85 * regulator_is_enabled() - Return whether or not regulator is currently enabled 86 * despite its refcount value. 87 * @regulator: Regulator reference 88 */ 89 bool regulator_is_enabled(struct regulator *regulator); 90 91 /* 92 * regulator_set_voltage() - Set regulator to target level in microvolt 93 * @regulator: Regulator reference 94 * @level_uv: Level in microvolt 95 */ 96 TEE_Result regulator_set_voltage(struct regulator *regulator, int level_uv); 97 98 /* 99 * regulator_register() - Register and initialize a regulator 100 * @regulator: Regulator reference 101 */ 102 TEE_Result regulator_register(struct regulator *regulator); 103 104 /* Print registered regulators and their state to the output console */ 105 void regulator_print_state(const char *message); 106 #else 107 static inline TEE_Result regulator_enable(struct regulator *regulator __unused) 108 { 109 return TEE_ERROR_NOT_SUPPORTED; 110 } 111 112 static inline TEE_Result regulator_disable(struct regulator *regulator __unused) 113 { 114 return TEE_ERROR_NOT_SUPPORTED; 115 } 116 117 static inline bool regulator_is_enabled(struct regulator *regulator __unused) 118 { 119 return false; 120 } 121 122 static inline TEE_Result regulator_set_voltage(struct regulator *regul __unused, 123 int level_mv __unused) 124 { 125 return TEE_ERROR_NOT_SUPPORTED; 126 } 127 128 static inline TEE_Result regulator_init(struct regulator *regulator __unused) 129 { 130 return TEE_ERROR_NOT_SUPPORTED; 131 } 132 133 static inline void regulator_print_state(const char *message __unused) 134 { 135 } 136 #endif /*CFG_DRIVERS_REGULATOR*/ 137 138 /* 139 * regulator_name() - Return regulator name or NULL 140 * @regulator: Regulator reference 141 */ 142 static inline const char *regulator_name(struct regulator *regulator) 143 { 144 return regulator->name; 145 } 146 147 /* 148 * regulator_is_always_on() - Return the state of REGULATOR_ALWAYS_ON flag 149 * @regulator: Regulator reference 150 */ 151 static inline bool regulator_is_always_on(struct regulator *regulator) 152 { 153 return regulator->flags & REGULATOR_ALWAYS_ON; 154 } 155 156 /* 157 * regulator_set_min_voltage() - Set regulator to its min level 158 * @regulator: Regulator reference 159 */ 160 static inline TEE_Result regulator_set_min_voltage(struct regulator *regulator) 161 { 162 return regulator_set_voltage(regulator, regulator->min_uv); 163 } 164 165 /* 166 * regulator_get_voltage() - Get regulator current level in microvolt 167 * @regulator: Regulator reference 168 */ 169 static inline int regulator_get_voltage(struct regulator *regulator) 170 { 171 return regulator->cur_uv; 172 } 173 174 /* 175 * regulator_get_range() - Get regulator min and/or max support levels 176 * @regulator: Regulator reference 177 * @min_mv: Output reference to min level in microvolt (uV) or NULL 178 * @max_mv: Output reference to max level in microvolt (uV) or NULL 179 */ 180 static inline void regulator_get_range(struct regulator *regulator, int *min_uv, 181 int *max_uv) 182 { 183 assert(regulator); 184 if (min_uv) 185 *min_uv = regulator->min_uv; 186 if (max_uv) 187 *max_uv = regulator->max_uv; 188 } 189 #endif /* DRIVERS_REGULATOR_H */ 190