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