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 16 struct regulator_ops; 17 18 /* 19 * struct regulator - A regulator instance 20 * @ops: Operation handlers for the regulator 21 * @supply: Regulator supply reference or NULL if none 22 * @priv: Regulator driver private data 23 * @name: Regulator string name for debug purpose or NULL 24 * @min_uv: Min possible voltage level in microvolt (uV) 25 * @max_uv: Max possible voltage level in microvolt (uV) 26 * @cur_uv: Current voltage level in microvolt (uV) 27 * @refcount: Regulator enable request reference counter 28 * @lock: Mutex for concurrent access protection 29 * @link: Link in initialized regulator list 30 */ 31 struct regulator { 32 /* Fields initialized by caller of regulator_register() */ 33 const struct regulator_ops *ops; 34 struct regulator *supply; 35 void *priv; 36 char *name; 37 int min_uv; 38 int max_uv; 39 /* Fields internal to regulator framework */ 40 int cur_uv; 41 unsigned int refcount; 42 struct mutex lock; /* Concurrent access protection */ 43 SLIST_ENTRY(regulator) link; 44 }; 45 46 /* 47 * struct regulator_ops - Regulator operation handlers 48 * 49 * @set_state: Enable or disable a regulator 50 * @get_state: Get regulator effective state 51 * @set_voltage: Set voltage level in microvolt (uV) 52 * @get_voltage: Get current voltage in microvolt (uV) 53 */ 54 struct regulator_ops { 55 TEE_Result (*set_state)(struct regulator *r, bool enabled); 56 TEE_Result (*get_state)(struct regulator *r, bool *enabled); 57 TEE_Result (*set_voltage)(struct regulator *r, int level_uv); 58 TEE_Result (*get_voltage)(struct regulator *r, int *level_uv); 59 }; 60 61 #ifdef CFG_DRIVERS_REGULATOR 62 /* 63 * regulator_enable() - Enable regulator 64 * @regulator: Regulator reference 65 */ 66 TEE_Result regulator_enable(struct regulator *regulator); 67 68 /* 69 * regulator_disable() - Disable regulator 70 * @regulator: Regulator reference 71 */ 72 TEE_Result regulator_disable(struct regulator *regulator); 73 74 /* 75 * regulator_is_enabled() - Return whether or not regulator is currently enabled 76 * despite its refcount value. 77 * @regulator: Regulator reference 78 */ 79 bool regulator_is_enabled(struct regulator *regulator); 80 81 /* 82 * regulator_set_voltage() - Set regulator to target level in microvolt 83 * @regulator: Regulator reference 84 * @level_uv: Level in microvolt 85 */ 86 TEE_Result regulator_set_voltage(struct regulator *regulator, int level_uv); 87 88 /* 89 * regulator_register() - Register and initialize a regulator 90 * @regulator: Regulator reference 91 */ 92 TEE_Result regulator_register(struct regulator *regulator); 93 94 /* Print registered regulators and their state to the output console */ 95 void regulator_print_state(const char *message); 96 #else 97 static inline TEE_Result regulator_enable(struct regulator *regulator __unused) 98 { 99 return TEE_ERROR_NOT_SUPPORTED; 100 } 101 102 static inline TEE_Result regulator_disable(struct regulator *regulator __unused) 103 { 104 return TEE_ERROR_NOT_SUPPORTED; 105 } 106 107 static inline bool regulator_is_enabled(struct regulator *regulator __unused) 108 { 109 return false; 110 } 111 112 static inline TEE_Result regulator_set_voltage(struct regulator *regul __unused, 113 int level_mv __unused) 114 { 115 return TEE_ERROR_NOT_SUPPORTED; 116 } 117 118 static inline TEE_Result regulator_init(struct regulator *regulator __unused) 119 { 120 return TEE_ERROR_NOT_SUPPORTED; 121 } 122 123 static inline void regulator_print_state(const char *message __unused) 124 { 125 } 126 #endif /*CFG_DRIVERS_REGULATOR*/ 127 128 /* 129 * regulator_name() - Return regulator name or NULL 130 * @regulator: Regulator reference 131 */ 132 static inline const char *regulator_name(struct regulator *regulator) 133 { 134 return regulator->name; 135 } 136 137 /* 138 * regulator_set_min_voltage() - Set regulator to its min level 139 * @regulator: Regulator reference 140 */ 141 static inline TEE_Result regulator_set_min_voltage(struct regulator *regulator) 142 { 143 return regulator_set_voltage(regulator, regulator->min_uv); 144 } 145 146 /* 147 * regulator_get_voltage() - Get regulator current level in microvolt 148 * @regulator: Regulator reference 149 */ 150 static inline int regulator_get_voltage(struct regulator *regulator) 151 { 152 return regulator->cur_uv; 153 } 154 155 /* 156 * regulator_get_range() - Get regulator min and/or max support levels 157 * @regulator: Regulator reference 158 * @min_mv: Output reference to min level in microvolt (uV) or NULL 159 * @max_mv: Output reference to max level in microvolt (uV) or NULL 160 */ 161 static inline void regulator_get_range(struct regulator *regulator, int *min_uv, 162 int *max_uv) 163 { 164 assert(regulator); 165 if (min_uv) 166 *min_uv = regulator->min_uv; 167 if (max_uv) 168 *max_uv = regulator->max_uv; 169 } 170 #endif /* DRIVERS_REGULATOR_H */ 171