Line data Source code
1 0 : /*
2 : * Copyright (c) 2019-2020 Peter Bigot Consulting, LLC
3 : * Copyright (c) 2021 NXP
4 : * Copyright (c) 2022 Nordic Semiconductor ASA
5 : * Copyright (c) 2023 EPAM Systems
6 : * Copyright (c) 2023 Meta Platforms
7 : * SPDX-License-Identifier: Apache-2.0
8 : */
9 :
10 : #ifndef ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_
11 : #define ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_
12 :
13 : /**
14 : * @brief Regulator Interface
15 : * @defgroup regulator_interface Regulator Interface
16 : * @since 2.4
17 : * @version 0.1.0
18 : * @ingroup io_interfaces
19 : * @{
20 : */
21 :
22 : #include <errno.h>
23 : #include <stdint.h>
24 :
25 : #include <zephyr/device.h>
26 : #include <zephyr/devicetree.h>
27 : #ifdef CONFIG_REGULATOR_THREAD_SAFE_REFCNT
28 : #include <zephyr/kernel.h>
29 : #endif
30 : #include <zephyr/sys/util_macro.h>
31 :
32 : #ifdef __cplusplus
33 : extern "C" {
34 : #endif
35 :
36 : /** Opaque type to store regulator DVS states */
37 1 : typedef uint8_t regulator_dvs_state_t;
38 :
39 : /** Opaque type to store regulator modes */
40 1 : typedef uint8_t regulator_mode_t;
41 :
42 : /** Opaque bit map for regulator error flags (see @ref REGULATOR_ERRORS) */
43 1 : typedef uint8_t regulator_error_flags_t;
44 :
45 : /**
46 : * @name Regulator error flags.
47 : * @anchor REGULATOR_ERRORS
48 : * @{
49 : */
50 :
51 : /** Voltage is too high. */
52 1 : #define REGULATOR_ERROR_OVER_VOLTAGE BIT(0)
53 : /** Current is too high. */
54 1 : #define REGULATOR_ERROR_OVER_CURRENT BIT(1)
55 : /** Temperature is too high. */
56 1 : #define REGULATOR_ERROR_OVER_TEMP BIT(2)
57 :
58 : /** @} */
59 :
60 : /** @cond INTERNAL_HIDDEN */
61 :
62 : typedef int (*regulator_dvs_state_set_t)(const struct device *dev,
63 : regulator_dvs_state_t state);
64 :
65 : typedef int (*regulator_ship_mode_t)(const struct device *dev);
66 :
67 : /** @brief Driver-specific API functions to support parent regulator control. */
68 : __subsystem struct regulator_parent_driver_api {
69 : regulator_dvs_state_set_t dvs_state_set;
70 : regulator_ship_mode_t ship_mode;
71 : };
72 :
73 : typedef int (*regulator_enable_t)(const struct device *dev);
74 : typedef int (*regulator_disable_t)(const struct device *dev);
75 : typedef unsigned int (*regulator_count_voltages_t)(const struct device *dev);
76 : typedef int (*regulator_list_voltage_t)(const struct device *dev,
77 : unsigned int idx, int32_t *volt_uv);
78 : typedef int (*regulator_set_voltage_t)(const struct device *dev, int32_t min_uv,
79 : int32_t max_uv);
80 : typedef int (*regulator_get_voltage_t)(const struct device *dev,
81 : int32_t *volt_uv);
82 : typedef unsigned int (*regulator_count_current_limits_t)(const struct device *dev);
83 : typedef int (*regulator_list_current_limit_t)(const struct device *dev,
84 : unsigned int idx, int32_t *current_ua);
85 : typedef int (*regulator_set_current_limit_t)(const struct device *dev,
86 : int32_t min_ua, int32_t max_ua);
87 : typedef int (*regulator_get_current_limit_t)(const struct device *dev,
88 : int32_t *curr_ua);
89 : typedef int (*regulator_set_mode_t)(const struct device *dev,
90 : regulator_mode_t mode);
91 : typedef int (*regulator_get_mode_t)(const struct device *dev,
92 : regulator_mode_t *mode);
93 : typedef int (*regulator_set_active_discharge_t)(const struct device *dev,
94 : bool active_discharge);
95 : typedef int (*regulator_get_active_discharge_t)(const struct device *dev,
96 : bool *active_discharge);
97 : typedef int (*regulator_get_error_flags_t)(
98 : const struct device *dev, regulator_error_flags_t *flags);
99 :
100 : /** @brief Driver-specific API functions to support regulator control. */
101 : __subsystem struct regulator_driver_api {
102 : regulator_enable_t enable;
103 : regulator_disable_t disable;
104 : regulator_count_voltages_t count_voltages;
105 : regulator_list_voltage_t list_voltage;
106 : regulator_set_voltage_t set_voltage;
107 : regulator_get_voltage_t get_voltage;
108 : regulator_count_current_limits_t count_current_limits;
109 : regulator_list_current_limit_t list_current_limit;
110 : regulator_set_current_limit_t set_current_limit;
111 : regulator_get_current_limit_t get_current_limit;
112 : regulator_set_mode_t set_mode;
113 : regulator_get_mode_t get_mode;
114 : regulator_set_active_discharge_t set_active_discharge;
115 : regulator_get_active_discharge_t get_active_discharge;
116 : regulator_get_error_flags_t get_error_flags;
117 : };
118 :
119 : /**
120 : * @name Regulator flags
121 : * @anchor REGULATOR_FLAGS
122 : * @{
123 : */
124 : /** Indicates regulator must stay always ON */
125 : #define REGULATOR_ALWAYS_ON BIT(0)
126 : /** Indicates regulator must be initialized ON */
127 : #define REGULATOR_BOOT_ON BIT(1)
128 : /** Indicates if regulator must be enabled when initialized */
129 : #define REGULATOR_INIT_ENABLED (REGULATOR_ALWAYS_ON | REGULATOR_BOOT_ON)
130 : /** Regulator active discharge state mask */
131 : #define REGULATOR_ACTIVE_DISCHARGE_MASK GENMASK(3, 2)
132 : /** Regulator active discharge state flag position*/
133 : #define REGULATOR_ACTIVE_DISCHARGE_POS 2
134 : /** Disable regulator active discharge */
135 : #define REGULATOR_ACTIVE_DISCHARGE_DISABLE 0
136 : /** Enable regulator active discharge */
137 : #define REGULATOR_ACTIVE_DISCHARGE_ENABLE 1
138 : /** Leave regulator active discharge state as default */
139 : #define REGULATOR_ACTIVE_DISCHARGE_DEFAULT 2
140 : /** Regulator active discharge set bits */
141 : #define REGULATOR_ACTIVE_DISCHARGE_SET_BITS(x) \
142 : (((x) << REGULATOR_ACTIVE_DISCHARGE_POS) & REGULATOR_ACTIVE_DISCHARGE_MASK)
143 : /** Regulator active discharge get bits */
144 : #define REGULATOR_ACTIVE_DISCHARGE_GET_BITS(x) \
145 : (((x) & REGULATOR_ACTIVE_DISCHARGE_MASK) >> REGULATOR_ACTIVE_DISCHARGE_POS)
146 : /** Indicates regulator must be initialized OFF */
147 : #define REGULATOR_BOOT_OFF BIT(4)
148 :
149 : /** @} */
150 :
151 : /** Indicates initial mode is unknown/not specified */
152 : #define REGULATOR_INITIAL_MODE_UNKNOWN UINT8_MAX
153 :
154 : /**
155 : * @brief Common regulator config.
156 : *
157 : * This structure **must** be placed first in the driver's config structure.
158 : */
159 : struct regulator_common_config {
160 : /** Minimum allowed voltage, in microvolts. */
161 : int32_t min_uv;
162 : /** Maximum allowed voltage, in microvolts. */
163 : int32_t max_uv;
164 : /** Initial voltage, in microvolts. */
165 : int32_t init_uv;
166 : /** Minimum allowed current, in microamps. */
167 : int32_t min_ua;
168 : /** Maximum allowed current, in microamps. */
169 : int32_t max_ua;
170 : /** Initial current, in microamps. */
171 : int32_t init_ua;
172 : /** Startup delay, in microseconds. */
173 : uint32_t startup_delay_us;
174 : /** Off to on delay, in microseconds. */
175 : uint32_t off_on_delay_us;
176 : /** Allowed modes */
177 : const regulator_mode_t *allowed_modes;
178 : /** Number of allowed modes */
179 : uint8_t allowed_modes_cnt;
180 : /** Regulator initial mode */
181 : regulator_mode_t initial_mode;
182 : /** Flags (@ref REGULATOR_FLAGS). */
183 : uint8_t flags;
184 : };
185 :
186 : /**
187 : * @brief Initialize common driver config from devicetree.
188 : *
189 : * @param node_id Node identifier.
190 : */
191 : #define REGULATOR_DT_COMMON_CONFIG_INIT(node_id) \
192 : { \
193 : .min_uv = DT_PROP_OR(node_id, regulator_min_microvolt, \
194 : INT32_MIN), \
195 : .max_uv = DT_PROP_OR(node_id, regulator_max_microvolt, \
196 : INT32_MAX), \
197 : .init_uv = DT_PROP_OR(node_id, regulator_init_microvolt, \
198 : INT32_MIN), \
199 : .min_ua = DT_PROP_OR(node_id, regulator_min_microamp, \
200 : INT32_MIN), \
201 : .max_ua = DT_PROP_OR(node_id, regulator_max_microamp, \
202 : INT32_MAX), \
203 : .init_ua = DT_PROP_OR(node_id, regulator_init_microamp, \
204 : INT32_MIN), \
205 : .startup_delay_us = DT_PROP_OR(node_id, startup_delay_us, 0), \
206 : .off_on_delay_us = DT_PROP_OR(node_id, off_on_delay_us, 0), \
207 : .allowed_modes = (const regulator_mode_t []) \
208 : DT_PROP_OR(node_id, regulator_allowed_modes, {}), \
209 : .allowed_modes_cnt = \
210 : DT_PROP_LEN_OR(node_id, regulator_allowed_modes, 0), \
211 : .initial_mode = DT_PROP_OR(node_id, regulator_initial_mode, \
212 : REGULATOR_INITIAL_MODE_UNKNOWN), \
213 : .flags = ((DT_PROP_OR(node_id, regulator_always_on, 0U) * \
214 : REGULATOR_ALWAYS_ON) | \
215 : (DT_PROP_OR(node_id, regulator_boot_on, 0U) * \
216 : REGULATOR_BOOT_ON) | \
217 : (REGULATOR_ACTIVE_DISCHARGE_SET_BITS( \
218 : DT_PROP_OR(node_id, regulator_active_discharge, \
219 : REGULATOR_ACTIVE_DISCHARGE_DEFAULT))) | \
220 : (DT_PROP_OR(node_id, regulator_boot_off, 0U) * \
221 : REGULATOR_BOOT_OFF)), \
222 : }
223 :
224 : /**
225 : * @brief Initialize common driver config from devicetree instance.
226 : *
227 : * @param inst Instance.
228 : */
229 : #define REGULATOR_DT_INST_COMMON_CONFIG_INIT(inst) \
230 : REGULATOR_DT_COMMON_CONFIG_INIT(DT_DRV_INST(inst))
231 :
232 : /**
233 : * @brief Common regulator data.
234 : *
235 : * This structure **must** be placed first in the driver's data structure.
236 : */
237 : struct regulator_common_data {
238 : #if defined(CONFIG_REGULATOR_THREAD_SAFE_REFCNT) || defined(__DOXYGEN__)
239 : /** Lock (only if @kconfig{CONFIG_REGULATOR_THREAD_SAFE_REFCNT}=y) */
240 : struct k_mutex lock;
241 : #endif
242 : /** Reference count */
243 : int refcnt;
244 : };
245 :
246 : /**
247 : * @brief Initialize common regulator data.
248 : *
249 : * This function **must** be called when driver is initialized.
250 : *
251 : * @param dev Regulator device instance.
252 : */
253 : void regulator_common_data_init(const struct device *dev);
254 :
255 : /**
256 : * @brief Common function to initialize the regulator at init time.
257 : *
258 : * This function needs to be called after drivers initialize the regulator. It
259 : * will:
260 : *
261 : * - Automatically enable the regulator if it is set to `regulator-boot-on`
262 : * or `regulator-always-on` and increase its usage count.
263 : * - Automatically disable the regulator if it is set to `regulator-boot-off`.
264 : * - Configure the regulator mode if `regulator-initial-mode` is set.
265 : * - Ensure regulator voltage is set to a valid range.
266 : *
267 : * Regulators that are enabled by default in hardware, must set @p is_enabled to
268 : * `true`.
269 : *
270 : * @param dev Regulator device instance
271 : * @param is_enabled Indicate if the regulator is enabled by default in
272 : * hardware.
273 : *
274 : * @retval 0 If enabled successfully.
275 : * @retval -errno Negative errno in case of failure.
276 : */
277 : int regulator_common_init(const struct device *dev, bool is_enabled);
278 :
279 : /**
280 : * @brief Check if regulator is expected to be enabled at init time.
281 : *
282 : * @param dev Regulator device instance
283 : * @return true If regulator needs to be enabled at init time.
284 : * @return false If regulator does not need to be enabled at init time.
285 : */
286 : static inline bool regulator_common_is_init_enabled(const struct device *dev)
287 : {
288 : const struct regulator_common_config *config =
289 : (const struct regulator_common_config *)dev->config;
290 :
291 : return (config->flags & REGULATOR_INIT_ENABLED) != 0U;
292 : }
293 :
294 : /**
295 : * @brief Get minimum supported voltage.
296 : *
297 : * @param dev Regulator device instance.
298 : * @param min_uv Where minimum voltage will be stored, in microvolts.
299 : *
300 : * @retval 0 If successful
301 : * @retval -ENOENT If minimum voltage is not specified.
302 : */
303 : static inline int regulator_common_get_min_voltage(const struct device *dev, int32_t *min_uv)
304 : {
305 : const struct regulator_common_config *config =
306 : (const struct regulator_common_config *)dev->config;
307 :
308 : if (config->min_uv == INT32_MIN) {
309 : return -ENOENT;
310 : }
311 :
312 : *min_uv = config->min_uv;
313 : return 0;
314 : }
315 :
316 : /**
317 : * @brief Get maximum supported voltage.
318 : *
319 : * @param dev Regulator device instance.
320 : * @param max_uv Where maximum voltage will be stored, in microvolts.
321 : *
322 : * @retval 0 If successful
323 : * @retval -ENOENT If maximum voltage is not specified.
324 : */
325 : static inline int regulator_common_get_max_voltage(const struct device *dev, int32_t *max_uv)
326 : {
327 : const struct regulator_common_config *config =
328 : (const struct regulator_common_config *)dev->config;
329 :
330 : if (config->max_uv == INT32_MAX) {
331 : return -ENOENT;
332 : }
333 :
334 : *max_uv = config->max_uv;
335 : return 0;
336 : }
337 :
338 : /** @endcond */
339 :
340 : /**
341 : * @brief Regulator Parent Interface
342 : * @defgroup regulator_parent_interface Regulator Parent Interface
343 : * @{
344 : */
345 :
346 : /**
347 : * @brief Set a DVS state.
348 : *
349 : * Some PMICs feature DVS (Dynamic Voltage Scaling) by allowing to program the
350 : * voltage level for multiple states. Such states may be automatically changed
351 : * by hardware using GPIO pins. Certain MCUs even allow to automatically
352 : * configure specific output pins when entering low-power modes so that PMIC
353 : * state is changed without software intervention. This API can be used when
354 : * state needs to be changed by software.
355 : *
356 : * @param dev Parent regulator device instance.
357 : * @param state DVS state (vendor specific identifier).
358 : *
359 : * @retval 0 If successful.
360 : * @retval -ENOTSUP If given state is not supported.
361 : * @retval -EPERM If state can't be changed by software.
362 : * @retval -ENOSYS If function is not implemented.
363 : * @retval -errno In case of any other error.
364 : */
365 1 : static inline int regulator_parent_dvs_state_set(const struct device *dev,
366 : regulator_dvs_state_t state)
367 : {
368 : const struct regulator_parent_driver_api *api =
369 : (const struct regulator_parent_driver_api *)dev->api;
370 :
371 : if (api->dvs_state_set == NULL) {
372 : return -ENOSYS;
373 : }
374 :
375 : return api->dvs_state_set(dev, state);
376 : }
377 :
378 : /**
379 : * @brief Enter ship mode.
380 : *
381 : * Some PMICs feature a ship mode, which allows the system to save power.
382 : * Exit from low power is normally by pin transition.
383 : *
384 : * This API can be used when ship mode needs to be entered.
385 : *
386 : * @param dev Parent regulator device instance.
387 : *
388 : * @retval 0 If successful.
389 : * @retval -ENOSYS If function is not implemented.
390 : * @retval -errno In case of any other error.
391 : */
392 1 : static inline int regulator_parent_ship_mode(const struct device *dev)
393 : {
394 : const struct regulator_parent_driver_api *api =
395 : (const struct regulator_parent_driver_api *)dev->api;
396 :
397 : if (api->ship_mode == NULL) {
398 : return -ENOSYS;
399 : }
400 :
401 : return api->ship_mode(dev);
402 : }
403 :
404 : /** @} */
405 :
406 : /**
407 : * @brief Enable a regulator.
408 : *
409 : * Reference-counted request that a regulator be turned on. A regulator is
410 : * considered "on" when it has reached a stable/usable state. Regulators that
411 : * are always on, or configured in devicetree with `regulator-always-on` will
412 : * always stay enabled, and so this function will always succeed.
413 : *
414 : * @param dev Regulator device instance
415 : *
416 : * @retval 0 If regulator has been successfully enabled.
417 : * @retval -errno Negative errno in case of failure.
418 : * @retval -ENOTSUP If regulator enablement can not be controlled.
419 : */
420 1 : int regulator_enable(const struct device *dev);
421 :
422 : /**
423 : * @brief Check if a regulator is enabled.
424 : *
425 : * @param dev Regulator device instance.
426 : *
427 : * @retval true If regulator is enabled.
428 : * @retval false If regulator is disabled.
429 : */
430 1 : bool regulator_is_enabled(const struct device *dev);
431 :
432 : /**
433 : * @brief Disable a regulator.
434 : *
435 : * Release a regulator after a previous regulator_enable() completed
436 : * successfully. Regulators that are always on, or configured in devicetree with
437 : * `regulator-always-on` will always stay enabled, and so this function will
438 : * always succeed.
439 : *
440 : * This must be invoked at most once for each successful regulator_enable().
441 : *
442 : * @param dev Regulator device instance.
443 : *
444 : * @retval 0 If regulator has been successfully disabled.
445 : * @retval -errno Negative errno in case of failure.
446 : * @retval -ENOTSUP If regulator disablement can not be controlled.
447 : */
448 1 : int regulator_disable(const struct device *dev);
449 :
450 : /**
451 : * @brief Obtain the number of supported voltage levels.
452 : *
453 : * Each voltage level supported by a regulator gets an index, starting from
454 : * zero. The total number of supported voltage levels can be used together with
455 : * regulator_list_voltage() to list all supported voltage levels.
456 : *
457 : * @param dev Regulator device instance.
458 : *
459 : * @return Number of supported voltages.
460 : */
461 1 : static inline unsigned int regulator_count_voltages(const struct device *dev)
462 : {
463 : const struct regulator_driver_api *api =
464 : (const struct regulator_driver_api *)dev->api;
465 :
466 : if (api->count_voltages == NULL) {
467 : return 0U;
468 : }
469 :
470 : return api->count_voltages(dev);
471 : }
472 :
473 : /**
474 : * @brief Obtain the value of a voltage given an index.
475 : *
476 : * Each voltage level supported by a regulator gets an index, starting from
477 : * zero. Together with regulator_count_voltages(), this function can be used
478 : * to iterate over all supported voltages.
479 : *
480 : * @param dev Regulator device instance.
481 : * @param idx Voltage index.
482 : * @param[out] volt_uv Where voltage for the given @p index will be stored, in
483 : * microvolts.
484 : *
485 : * @retval 0 If @p index corresponds to a supported voltage.
486 : * @retval -EINVAL If @p index does not correspond to a supported voltage.
487 : */
488 1 : static inline int regulator_list_voltage(const struct device *dev,
489 : unsigned int idx, int32_t *volt_uv)
490 : {
491 : const struct regulator_driver_api *api =
492 : (const struct regulator_driver_api *)dev->api;
493 :
494 : if (api->list_voltage == NULL) {
495 : return -EINVAL;
496 : }
497 :
498 : return api->list_voltage(dev, idx, volt_uv);
499 : }
500 :
501 : /**
502 : * @brief Check if a voltage within a window is supported.
503 : *
504 : * @param dev Regulator device instance.
505 : * @param min_uv Minimum voltage in microvolts.
506 : * @param max_uv maximum voltage in microvolts.
507 : *
508 : * @retval true If voltage is supported.
509 : * @retval false If voltage is not supported.
510 : */
511 1 : bool regulator_is_supported_voltage(const struct device *dev, int32_t min_uv,
512 : int32_t max_uv);
513 :
514 : /**
515 : * @brief Set the output voltage.
516 : *
517 : * The output voltage will be configured to the closest supported output
518 : * voltage. regulator_get_voltage() can be used to obtain the actual configured
519 : * voltage. The voltage will be applied to the active or selected mode. Output
520 : * voltage may be limited using `regulator-min-microvolt` and/or
521 : * `regulator-max-microvolt` in devicetree.
522 : *
523 : * @param dev Regulator device instance.
524 : * @param min_uv Minimum acceptable voltage in microvolts.
525 : * @param max_uv Maximum acceptable voltage in microvolts.
526 : *
527 : * @retval 0 If successful.
528 : * @retval -EINVAL If the given voltage window is not valid.
529 : * @retval -ENOSYS If function is not implemented.
530 : * @retval -errno In case of any other error.
531 : */
532 1 : int regulator_set_voltage(const struct device *dev, int32_t min_uv,
533 : int32_t max_uv);
534 :
535 : /**
536 : * @brief Obtain output voltage.
537 : *
538 : * @param dev Regulator device instance.
539 : * @param[out] volt_uv Where configured output voltage will be stored.
540 : *
541 : * @retval 0 If successful
542 : * @retval -ENOSYS If function is not implemented.
543 : * @retval -errno In case of any other error.
544 : */
545 1 : static inline int regulator_get_voltage(const struct device *dev,
546 : int32_t *volt_uv)
547 : {
548 : const struct regulator_driver_api *api =
549 : (const struct regulator_driver_api *)dev->api;
550 :
551 : if (api->get_voltage == NULL) {
552 : return -ENOSYS;
553 : }
554 :
555 : return api->get_voltage(dev, volt_uv);
556 : }
557 :
558 : /**
559 : * @brief Obtain the number of supported current limit levels.
560 : *
561 : * Each current limit level supported by a regulator gets an index, starting from
562 : * zero. The total number of supported current limit levels can be used together with
563 : * regulator_list_current_limit() to list all supported current limit levels.
564 : *
565 : * @param dev Regulator device instance.
566 : *
567 : * @return Number of supported current limits.
568 : */
569 1 : static inline unsigned int regulator_count_current_limits(const struct device *dev)
570 : {
571 : const struct regulator_driver_api *api =
572 : (const struct regulator_driver_api *)dev->api;
573 :
574 : if (api->count_current_limits == NULL) {
575 : return 0U;
576 : }
577 :
578 : return api->count_current_limits(dev);
579 : }
580 :
581 : /**
582 : * @brief Obtain the value of a current limit given an index.
583 : *
584 : * Each current limit level supported by a regulator gets an index, starting from
585 : * zero. Together with regulator_count_current_limits(), this function can be used
586 : * to iterate over all supported current limits.
587 : *
588 : * @param dev Regulator device instance.
589 : * @param idx Current index.
590 : * @param[out] current_ua Where current for the given @p index will be stored, in
591 : * microamps.
592 : *
593 : * @retval 0 If @p index corresponds to a supported current limit.
594 : * @retval -EINVAL If @p index does not correspond to a supported current limit.
595 : */
596 1 : static inline int regulator_list_current_limit(const struct device *dev,
597 : unsigned int idx, int32_t *current_ua)
598 : {
599 : const struct regulator_driver_api *api =
600 : (const struct regulator_driver_api *)dev->api;
601 :
602 : if (api->list_current_limit == NULL) {
603 : return -EINVAL;
604 : }
605 :
606 : return api->list_current_limit(dev, idx, current_ua);
607 : }
608 :
609 : /**
610 : * @brief Set output current limit.
611 : *
612 : * The output current limit will be configured to the closest supported output
613 : * current limit. regulator_get_current_limit() can be used to obtain the actual
614 : * configured current limit. Current may be limited using `current-min-microamp`
615 : * and/or `current-max-microamp` in Devicetree.
616 : *
617 : * @param dev Regulator device instance.
618 : * @param min_ua Minimum acceptable current limit in microamps.
619 : * @param max_ua Maximum acceptable current limit in microamps.
620 : *
621 : * @retval 0 If successful.
622 : * @retval -EINVAL If the given current limit window is not valid.
623 : * @retval -ENOSYS If function is not implemented.
624 : * @retval -errno In case of any other error.
625 : */
626 1 : int regulator_set_current_limit(const struct device *dev, int32_t min_ua,
627 : int32_t max_ua);
628 :
629 : /**
630 : * @brief Get output current limit.
631 : *
632 : * @param dev Regulator device instance.
633 : * @param[out] curr_ua Where output current limit will be stored.
634 : *
635 : * @retval 0 If successful.
636 : * @retval -ENOSYS If function is not implemented.
637 : * @retval -errno In case of any other error.
638 : */
639 1 : static inline int regulator_get_current_limit(const struct device *dev,
640 : int32_t *curr_ua)
641 : {
642 : const struct regulator_driver_api *api =
643 : (const struct regulator_driver_api *)dev->api;
644 :
645 : if (api->get_current_limit == NULL) {
646 : return -ENOSYS;
647 : }
648 :
649 : return api->get_current_limit(dev, curr_ua);
650 : }
651 :
652 : /**
653 : * @brief Set mode.
654 : *
655 : * Regulators can support multiple modes in order to permit different voltage
656 : * configuration or better power savings. This API will apply a mode for
657 : * the regulator. Allowed modes may be limited using `regulator-allowed-modes`
658 : * devicetree property.
659 : *
660 : * @param dev Regulator device instance.
661 : * @param mode Mode to select for this regulator.
662 : *
663 : * @retval 0 If successful.
664 : * @retval -ENOTSUP If mode is not supported.
665 : * @retval -ENOSYS If function is not implemented.
666 : * @retval -errno In case of any other error.
667 : */
668 1 : int regulator_set_mode(const struct device *dev, regulator_mode_t mode);
669 :
670 : /**
671 : * @brief Get mode.
672 : *
673 : * @param dev Regulator device instance.
674 : * @param[out] mode Where mode will be stored.
675 : *
676 : * @retval 0 If successful.
677 : * @retval -ENOSYS If function is not implemented.
678 : * @retval -errno In case of any other error.
679 : */
680 1 : static inline int regulator_get_mode(const struct device *dev,
681 : regulator_mode_t *mode)
682 : {
683 : const struct regulator_driver_api *api =
684 : (const struct regulator_driver_api *)dev->api;
685 :
686 : if (api->get_mode == NULL) {
687 : return -ENOSYS;
688 : }
689 :
690 : return api->get_mode(dev, mode);
691 : }
692 :
693 : /**
694 : * @brief Set active discharge setting.
695 : *
696 : * @param dev Regulator device instance.
697 : * @param active_discharge Active discharge enable or disable.
698 : *
699 : * @retval 0 If successful.
700 : * @retval -ENOSYS If function is not implemented.
701 : * @retval -errno In case of any other error.
702 : */
703 1 : static inline int regulator_set_active_discharge(const struct device *dev,
704 : bool active_discharge)
705 : {
706 : const struct regulator_driver_api *api =
707 : (const struct regulator_driver_api *)dev->api;
708 :
709 : if (api->set_active_discharge == NULL) {
710 : return -ENOSYS;
711 : }
712 :
713 : return api->set_active_discharge(dev, active_discharge);
714 : }
715 :
716 : /**
717 : * @brief Get active discharge setting.
718 : *
719 : * @param dev Regulator device instance.
720 : * @param[out] active_discharge Where active discharge will be stored.
721 : *
722 : * @retval 0 If successful.
723 : * @retval -ENOSYS If function is not implemented.
724 : * @retval -errno In case of any other error.
725 : */
726 1 : static inline int regulator_get_active_discharge(const struct device *dev,
727 : bool *active_discharge)
728 : {
729 : const struct regulator_driver_api *api =
730 : (const struct regulator_driver_api *)dev->api;
731 :
732 : if (api->get_active_discharge == NULL) {
733 : return -ENOSYS;
734 : }
735 :
736 : return api->get_active_discharge(dev, active_discharge);
737 : }
738 :
739 : /**
740 : * @brief Get active error flags.
741 : *
742 : * @param dev Regulator device instance.
743 : * @param[out] flags Where error flags will be stored.
744 : *
745 : * @retval 0 If successful.
746 : * @retval -ENOSYS If function is not implemented.
747 : * @retval -errno In case of any other error.
748 : */
749 1 : static inline int regulator_get_error_flags(const struct device *dev,
750 : regulator_error_flags_t *flags)
751 : {
752 : const struct regulator_driver_api *api =
753 : (const struct regulator_driver_api *)dev->api;
754 :
755 : if (api->get_error_flags == NULL) {
756 : return -ENOSYS;
757 : }
758 :
759 : return api->get_error_flags(dev, flags);
760 : }
761 :
762 : #ifdef __cplusplus
763 : }
764 : #endif
765 :
766 : /** @} */
767 :
768 : #endif /* ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_ */
|