]>
Commit | Line | Data |
---|---|---|
af41e8db PM |
1 | /* |
2 | * Copyright (C) 2014-2015 Samsung Electronics | |
3 | * Przemyslaw Marczak <[email protected]> | |
4 | * | |
5 | * SPDX-License-Identifier: GPL-2.0+ | |
6 | */ | |
7 | ||
8 | #ifndef _INCLUDE_REGULATOR_H_ | |
9 | #define _INCLUDE_REGULATOR_H_ | |
10 | ||
11 | /** | |
12 | * U-Boot Voltage/Current Regulator | |
13 | * ================================ | |
14 | * | |
15 | * The regulator API is based on a driver model, with the device tree support. | |
16 | * And this header describes the functions and data types for the uclass id: | |
17 | * 'UCLASS_REGULATOR' and the regulator driver API. | |
18 | * | |
19 | * The regulator uclass - is based on uclass platform data which is allocated, | |
20 | * automatically for each regulator device on bind and 'dev->uclass_platdata' | |
21 | * points to it. The data type is: 'struct dm_regulator_uclass_platdata'. | |
22 | * The uclass file: 'drivers/power/regulator/regulator-uclass.c' | |
23 | * | |
24 | * The regulator device - is based on driver's model 'struct udevice'. | |
25 | * The API can use regulator name in two meanings: | |
26 | * - devname - the regulator device's name: 'dev->name' | |
27 | * - platname - the device's platdata's name. So in the code it looks like: | |
28 | * 'uc_pdata = dev->uclass_platdata'; 'name = uc_pdata->name'. | |
29 | * | |
30 | * The regulator device driver - provide an implementation of uclass operations | |
31 | * pointed by 'dev->driver->ops' as a struct of type 'struct dm_regulator_ops'. | |
32 | * | |
33 | * To proper bind the regulator device, the device tree node should provide | |
34 | * regulator constraints, like in the example below: | |
35 | * | |
36 | * ldo1 { | |
3b880757 | 37 | * regulator-name = "VDD_MMC_1.8V"; (must be unique for proper bind) |
af41e8db PM |
38 | * regulator-min-microvolt = <1000000>; (optional) |
39 | * regulator-max-microvolt = <1000000>; (optional) | |
40 | * regulator-min-microamp = <1000>; (optional) | |
41 | * regulator-max-microamp = <1000>; (optional) | |
42 | * regulator-always-on; (optional) | |
43 | * regulator-boot-on; (optional) | |
44 | * }; | |
45 | * | |
3b880757 PM |
46 | * Note: For the proper operation, at least name constraint is needed, since |
47 | * it can be used when calling regulator_get_by_platname(). And the mandatory | |
48 | * rule for this name is, that it must be globally unique for the single dts. | |
af41e8db PM |
49 | * |
50 | * Regulator bind: | |
51 | * For each regulator device, the device_bind() should be called with passed | |
52 | * device tree offset. This is required for this uclass's '.post_bind' method, | |
3b880757 | 53 | * which does the scan on the device node, for the 'regulator-name' constraint. |
af41e8db PM |
54 | * If the parent is not a PMIC device, and the child is not bind by function: |
55 | * 'pmic_bind_childs()', then it's recommended to bind the device by call to | |
56 | * dm_scan_fdt_node() - this is usually done automatically for bus devices, | |
57 | * as a post bind method. | |
3b880757 PM |
58 | * |
59 | * Regulator get: | |
af41e8db | 60 | * Having the device's name constraint, we can call regulator_by_platname(), |
3b880757 | 61 | * to find the required regulator. Before return, the regulator is probed, |
af41e8db PM |
62 | * and the rest of its constraints are put into the device's uclass platform |
63 | * data, by the uclass regulator '.pre_probe' method. | |
64 | * | |
65 | * For more info about PMIC bind, please refer to file: 'include/power/pmic.h' | |
66 | * | |
67 | * Note: | |
68 | * Please do not use the device_bind_by_name() function, since it pass '-1' as | |
69 | * device node offset - and the bind will fail on uclass .post_bind method, | |
70 | * because of missing 'regulator-name' constraint. | |
71 | * | |
72 | * | |
73 | * Fixed Voltage/Current Regulator | |
74 | * =============================== | |
75 | * | |
76 | * When fixed voltage regulator is needed, then enable the config: | |
77 | * - CONFIG_DM_REGULATOR_FIXED | |
78 | * | |
79 | * The driver file: 'drivers/power/regulator/fixed.c', provides basic support | |
80 | * for control the GPIO, and return the device tree constraint values. | |
81 | * | |
82 | * To bind the fixed voltage regulator device, we usually use a 'simple-bus' | |
83 | * node as a parent. And 'regulator-fixed' for the driver compatible. This is | |
84 | * the same as in the kernel. The example node of fixed regulator: | |
85 | * | |
86 | * simple-bus { | |
87 | * compatible = "simple-bus"; | |
88 | * #address-cells = <1>; | |
89 | * #size-cells = <0>; | |
90 | * | |
91 | * blue_led { | |
92 | * compatible = "regulator-fixed"; | |
93 | * regulator-name = "VDD_LED_3.3V"; | |
94 | * regulator-min-microvolt = <3300000>; | |
95 | * regulator-max-microvolt = <3300000>; | |
96 | * gpio = <&gpc1 0 GPIO_ACTIVE_LOW>; | |
97 | * }; | |
98 | * }; | |
99 | * | |
100 | * The fixed regulator devices also provide regulator uclass platform data. And | |
101 | * devices bound from such node, can use the regulator drivers API. | |
102 | */ | |
103 | ||
104 | /* enum regulator_type - used for regulator_*() variant calls */ | |
105 | enum regulator_type { | |
106 | REGULATOR_TYPE_LDO = 0, | |
107 | REGULATOR_TYPE_BUCK, | |
108 | REGULATOR_TYPE_DVS, | |
109 | REGULATOR_TYPE_FIXED, | |
110 | REGULATOR_TYPE_OTHER, | |
111 | }; | |
112 | ||
113 | /** | |
114 | * struct dm_regulator_mode - this structure holds an information about | |
115 | * each regulator operation mode. Probably in most cases - an array. | |
116 | * This will be probably a driver-static data, since it is device-specific. | |
117 | * | |
118 | * @id - a driver-specific mode id | |
119 | * @register_value - a driver-specific value for its mode id | |
120 | * @name - the name of mode - used for regulator command | |
121 | * Note: | |
122 | * The field 'id', should be always a positive number, since the negative values | |
123 | * are reserved for the errno numbers when returns the mode id. | |
124 | */ | |
125 | struct dm_regulator_mode { | |
126 | int id; /* Set only as >= 0 (negative value is reserved for errno) */ | |
127 | int register_value; | |
128 | const char *name; | |
129 | }; | |
130 | ||
7837ceab SG |
131 | enum regulator_flag { |
132 | REGULATOR_FLAG_AUTOSET_UV = 1 << 0, | |
133 | REGULATOR_FLAG_AUTOSET_UA = 1 << 1, | |
134 | }; | |
135 | ||
af41e8db PM |
136 | /** |
137 | * struct dm_regulator_uclass_platdata - pointed by dev->uclass_platdata, and | |
138 | * allocated on each regulator bind. This structure holds an information | |
139 | * about each regulator's constraints and supported operation modes. | |
140 | * There is no "step" voltage value - so driver should take care of this. | |
141 | * | |
142 | * @type - one of 'enum regulator_type' | |
143 | * @mode - pointer to the regulator mode (array if more than one) | |
144 | * @mode_count - number of '.mode' entries | |
145 | * @min_uV* - minimum voltage (micro Volts) | |
146 | * @max_uV* - maximum voltage (micro Volts) | |
147 | * @min_uA* - minimum amperage (micro Amps) | |
148 | * @max_uA* - maximum amperage (micro Amps) | |
149 | * @always_on* - bool type, true or false | |
150 | * @boot_on* - bool type, true or false | |
7837ceab SG |
151 | * TODO([email protected]): Consider putting the above two into @flags |
152 | * @flags: - flags value (see REGULATOR_FLAG_...) | |
af41e8db PM |
153 | * @name** - fdt regulator name - should be taken from the device tree |
154 | * | |
155 | * Note: | |
156 | * * - set automatically on device probe by the uclass's '.pre_probe' method. | |
157 | * ** - set automatically on device bind by the uclass's '.post_bind' method. | |
158 | * The constraints: type, mode, mode_count, can be set by device driver, e.g. | |
159 | * by the driver '.probe' method. | |
160 | */ | |
161 | struct dm_regulator_uclass_platdata { | |
162 | enum regulator_type type; | |
163 | struct dm_regulator_mode *mode; | |
164 | int mode_count; | |
165 | int min_uV; | |
166 | int max_uV; | |
167 | int min_uA; | |
168 | int max_uA; | |
169 | bool always_on; | |
170 | bool boot_on; | |
171 | const char *name; | |
7837ceab | 172 | int flags; |
af41e8db PM |
173 | }; |
174 | ||
175 | /* Regulator device operations */ | |
176 | struct dm_regulator_ops { | |
177 | /** | |
178 | * The regulator output value function calls operates on a micro Volts. | |
179 | * | |
180 | * get/set_value - get/set output value of the given output number | |
181 | * @dev - regulator device | |
182 | * Sets: | |
183 | * @uV - set the output value [micro Volts] | |
1757df46 | 184 | * @return output value [uV] on success or negative errno if fail. |
af41e8db PM |
185 | */ |
186 | int (*get_value)(struct udevice *dev); | |
187 | int (*set_value)(struct udevice *dev, int uV); | |
188 | ||
189 | /** | |
190 | * The regulator output current function calls operates on a micro Amps. | |
191 | * | |
192 | * get/set_current - get/set output current of the given output number | |
193 | * @dev - regulator device | |
194 | * Sets: | |
195 | * @uA - set the output current [micro Amps] | |
1757df46 | 196 | * @return output value [uA] on success or negative errno if fail. |
af41e8db PM |
197 | */ |
198 | int (*get_current)(struct udevice *dev); | |
199 | int (*set_current)(struct udevice *dev, int uA); | |
200 | ||
201 | /** | |
202 | * The most basic feature of the regulator output is its enable state. | |
203 | * | |
204 | * get/set_enable - get/set enable state of the given output number | |
205 | * @dev - regulator device | |
206 | * Sets: | |
207 | * @enable - set true - enable or false - disable | |
1757df46 | 208 | * @return true/false for get; or 0 / -errno for set. |
af41e8db PM |
209 | */ |
210 | bool (*get_enable)(struct udevice *dev); | |
211 | int (*set_enable)(struct udevice *dev, bool enable); | |
212 | ||
213 | /** | |
1757df46 | 214 | * The 'get/set_mode()' function calls should operate on a driver- |
3b880757 PM |
215 | * specific mode id definitions, which should be found in: |
216 | * field 'id' of struct dm_regulator_mode. | |
af41e8db PM |
217 | * |
218 | * get/set_mode - get/set operation mode of the given output number | |
219 | * @dev - regulator device | |
220 | * Sets | |
221 | * @mode_id - set output mode id (struct dm_regulator_mode->id) | |
1757df46 | 222 | * @return id/0 for get/set on success or negative errno if fail. |
af41e8db PM |
223 | * Note: |
224 | * The field 'id' of struct type 'dm_regulator_mode', should be always | |
3b880757 | 225 | * a positive number, since the negative is reserved for the error. |
af41e8db PM |
226 | */ |
227 | int (*get_mode)(struct udevice *dev); | |
228 | int (*set_mode)(struct udevice *dev, int mode_id); | |
229 | }; | |
230 | ||
231 | /** | |
232 | * regulator_mode: returns a pointer to the array of regulator mode info | |
233 | * | |
234 | * @dev - pointer to the regulator device | |
235 | * @modep - pointer to the returned mode info array | |
1757df46 | 236 | * @return - count of modep entries on success or negative errno if fail. |
af41e8db PM |
237 | */ |
238 | int regulator_mode(struct udevice *dev, struct dm_regulator_mode **modep); | |
239 | ||
240 | /** | |
241 | * regulator_get_value: get microvoltage voltage value of a given regulator | |
242 | * | |
243 | * @dev - pointer to the regulator device | |
1757df46 | 244 | * @return - positive output value [uV] on success or negative errno if fail. |
af41e8db PM |
245 | */ |
246 | int regulator_get_value(struct udevice *dev); | |
247 | ||
248 | /** | |
249 | * regulator_set_value: set the microvoltage value of a given regulator. | |
250 | * | |
251 | * @dev - pointer to the regulator device | |
252 | * @uV - the output value to set [micro Volts] | |
1757df46 | 253 | * @return - 0 on success or -errno val if fails |
af41e8db PM |
254 | */ |
255 | int regulator_set_value(struct udevice *dev, int uV); | |
256 | ||
257 | /** | |
258 | * regulator_get_current: get microampere value of a given regulator | |
259 | * | |
260 | * @dev - pointer to the regulator device | |
1757df46 | 261 | * @return - positive output current [uA] on success or negative errno if fail. |
af41e8db PM |
262 | */ |
263 | int regulator_get_current(struct udevice *dev); | |
264 | ||
265 | /** | |
266 | * regulator_set_current: set the microampere value of a given regulator. | |
267 | * | |
268 | * @dev - pointer to the regulator device | |
269 | * @uA - set the output current [micro Amps] | |
1757df46 | 270 | * @return - 0 on success or -errno val if fails |
af41e8db PM |
271 | */ |
272 | int regulator_set_current(struct udevice *dev, int uA); | |
273 | ||
274 | /** | |
275 | * regulator_get_enable: get regulator device enable state. | |
276 | * | |
277 | * @dev - pointer to the regulator device | |
1757df46 | 278 | * @return - true/false of enable state |
af41e8db PM |
279 | */ |
280 | bool regulator_get_enable(struct udevice *dev); | |
281 | ||
282 | /** | |
283 | * regulator_set_enable: set regulator enable state | |
284 | * | |
285 | * @dev - pointer to the regulator device | |
286 | * @enable - set true or false | |
1757df46 | 287 | * @return - 0 on success or -errno val if fails |
af41e8db PM |
288 | */ |
289 | int regulator_set_enable(struct udevice *dev, bool enable); | |
290 | ||
291 | /** | |
3b880757 | 292 | * regulator_get_mode: get active operation mode id of a given regulator |
af41e8db PM |
293 | * |
294 | * @dev - pointer to the regulator device | |
3b880757 | 295 | * @return - positive mode 'id' number on success or -errno val if fails |
af41e8db | 296 | * Note: |
3b880757 PM |
297 | * The device can provide an array of operating modes, which is type of struct |
298 | * dm_regulator_mode. Each mode has it's own 'id', which should be unique inside | |
299 | * that array. By calling this function, the driver should return an active mode | |
300 | * id of the given regulator device. | |
af41e8db PM |
301 | */ |
302 | int regulator_get_mode(struct udevice *dev); | |
303 | ||
304 | /** | |
3b880757 | 305 | * regulator_set_mode: set the given regulator's, active mode id |
af41e8db | 306 | * |
3b880757 PM |
307 | * @dev - pointer to the regulator device |
308 | * @mode_id - mode id to set ('id' field of struct type dm_regulator_mode) | |
309 | * @return - 0 on success or -errno value if fails | |
af41e8db | 310 | * Note: |
3b880757 PM |
311 | * The device can provide an array of operating modes, which is type of struct |
312 | * dm_regulator_mode. Each mode has it's own 'id', which should be unique inside | |
313 | * that array. By calling this function, the driver should set the active mode | |
314 | * of a given regulator to given by "mode_id" argument. | |
af41e8db | 315 | */ |
3b880757 | 316 | int regulator_set_mode(struct udevice *dev, int mode_id); |
af41e8db PM |
317 | |
318 | /** | |
3b55d30f SG |
319 | * regulator_autoset: setup the voltage/current on a regulator |
320 | * | |
321 | * The setup depends on constraints found in device's uclass's platform data | |
322 | * (struct dm_regulator_uclass_platdata): | |
323 | * | |
324 | * - Enable - will set - if any of: 'always_on' or 'boot_on' is set to true, | |
325 | * or if both are unset, then the function returns | |
326 | * - Voltage value - will set - if '.min_uV' and '.max_uV' values are equal | |
327 | * - Current limit - will set - if '.min_uA' and '.max_uA' values are equal | |
328 | * | |
329 | * The function returns on the first-encountered error. | |
330 | * | |
331 | * @platname - expected string for dm_regulator_uclass_platdata .name field | |
332 | * @devp - returned pointer to the regulator device - if non-NULL passed | |
333 | * @return: 0 on success or negative value of errno. | |
334 | */ | |
335 | int regulator_autoset(struct udevice *dev); | |
336 | ||
337 | /** | |
338 | * regulator_autoset_by_name: setup the regulator given by its uclass's | |
339 | * platform data name field. The setup depends on constraints found in device's | |
340 | * uclass's platform data (struct dm_regulator_uclass_platdata): | |
3b880757 PM |
341 | * - Enable - will set - if any of: 'always_on' or 'boot_on' is set to true, |
342 | * or if both are unset, then the function returns | |
af41e8db PM |
343 | * - Voltage value - will set - if '.min_uV' and '.max_uV' values are equal |
344 | * - Current limit - will set - if '.min_uA' and '.max_uA' values are equal | |
af41e8db PM |
345 | * |
346 | * The function returns on first encountered error. | |
347 | * | |
348 | * @platname - expected string for dm_regulator_uclass_platdata .name field | |
3b880757 | 349 | * @devp - returned pointer to the regulator device - if non-NULL passed |
1757df46 | 350 | * @return: 0 on success or negative value of errno. |
af41e8db PM |
351 | * |
352 | * The returned 'regulator' device can be used with: | |
353 | * - regulator_get/set_* | |
af41e8db | 354 | */ |
3b55d30f | 355 | int regulator_autoset_by_name(const char *platname, struct udevice **devp); |
af41e8db PM |
356 | |
357 | /** | |
3b880757 PM |
358 | * regulator_list_autoset: setup the regulators given by list of their uclass's |
359 | * platform data name field. The setup depends on constraints found in device's | |
360 | * uclass's platform data. The function loops with calls to: | |
3b55d30f | 361 | * regulator_autoset_by_name() for each name from the list. |
af41e8db PM |
362 | * |
363 | * @list_platname - an array of expected strings for .name field of each | |
364 | * regulator's uclass platdata | |
af41e8db PM |
365 | * @list_devp - an array of returned pointers to the successfully setup |
366 | * regulator devices if non-NULL passed | |
367 | * @verbose - (true/false) print each regulator setup info, or be quiet | |
3b880757 | 368 | * @return 0 on successfully setup of all list entries, otherwise first error. |
af41e8db PM |
369 | * |
370 | * The returned 'regulator' devices can be used with: | |
371 | * - regulator_get/set_* | |
3b880757 PM |
372 | * |
373 | * Note: The list must ends with NULL entry, like in the "platname" list below: | |
374 | * char *my_regulators[] = { | |
375 | * "VCC_3.3V", | |
376 | * "VCC_1.8V", | |
377 | * NULL, | |
378 | * }; | |
af41e8db | 379 | */ |
3b880757 PM |
380 | int regulator_list_autoset(const char *list_platname[], |
381 | struct udevice *list_devp[], | |
382 | bool verbose); | |
af41e8db PM |
383 | |
384 | /** | |
3b880757 PM |
385 | * regulator_get_by_devname: returns the pointer to the pmic regulator device. |
386 | * Search by name, found in regulator device's name. | |
af41e8db PM |
387 | * |
388 | * @devname - expected string for 'dev->name' of regulator device | |
1757df46 PM |
389 | * @devp - returned pointer to the regulator device |
390 | * @return 0 on success or negative value of errno. | |
af41e8db | 391 | * |
3b880757 | 392 | * The returned 'regulator' device is probed and can be used with: |
af41e8db PM |
393 | * - regulator_get/set_* |
394 | */ | |
3b880757 | 395 | int regulator_get_by_devname(const char *devname, struct udevice **devp); |
af41e8db PM |
396 | |
397 | /** | |
3b880757 PM |
398 | * regulator_get_by_platname: returns the pointer to the pmic regulator device. |
399 | * Search by name, found in regulator uclass platdata. | |
af41e8db | 400 | * |
1757df46 | 401 | * @platname - expected string for uc_pdata->name of regulator uclass platdata |
3b55d30f | 402 | * @devp - returns pointer to the regulator device or NULL on error |
1757df46 | 403 | * @return 0 on success or negative value of errno. |
af41e8db | 404 | * |
3b880757 | 405 | * The returned 'regulator' device is probed and can be used with: |
af41e8db PM |
406 | * - regulator_get/set_* |
407 | */ | |
3b880757 | 408 | int regulator_get_by_platname(const char *platname, struct udevice **devp); |
af41e8db PM |
409 | |
410 | #endif /* _INCLUDE_REGULATOR_H_ */ |