xref: /optee_os/core/include/drivers/regulator.h (revision 193944aadbe838780b4c6b9c94c0a739526b5e79)
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