Zephyr API Documentation  3.6.0
A Scalable Open Source RTOS
3.6.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
regulator.h
Go to the documentation of this file.
1/*
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
20#include <errno.h>
21#include <stdint.h>
22
23#include <zephyr/device.h>
24#include <zephyr/devicetree.h>
25#ifdef CONFIG_REGULATOR_THREAD_SAFE_REFCNT
26#include <zephyr/kernel.h>
27#endif
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
36
39
42
50#define REGULATOR_ERROR_OVER_VOLTAGE BIT(0)
52#define REGULATOR_ERROR_OVER_CURRENT BIT(1)
54#define REGULATOR_ERROR_OVER_TEMP BIT(2)
55
60typedef int (*regulator_dvs_state_set_t)(const struct device *dev,
62
63typedef int (*regulator_ship_mode_t)(const struct device *dev);
64
66__subsystem struct regulator_parent_driver_api {
67 regulator_dvs_state_set_t dvs_state_set;
68 regulator_ship_mode_t ship_mode;
69};
70
71typedef int (*regulator_enable_t)(const struct device *dev);
72typedef int (*regulator_disable_t)(const struct device *dev);
73typedef unsigned int (*regulator_count_voltages_t)(const struct device *dev);
74typedef int (*regulator_list_voltage_t)(const struct device *dev,
75 unsigned int idx, int32_t *volt_uv);
76typedef int (*regulator_set_voltage_t)(const struct device *dev, int32_t min_uv,
77 int32_t max_uv);
78typedef int (*regulator_get_voltage_t)(const struct device *dev,
79 int32_t *volt_uv);
80typedef unsigned int (*regulator_count_current_limits_t)(const struct device *dev);
81typedef int (*regulator_list_current_limit_t)(const struct device *dev,
82 unsigned int idx, int32_t *current_ua);
83typedef int (*regulator_set_current_limit_t)(const struct device *dev,
84 int32_t min_ua, int32_t max_ua);
85typedef int (*regulator_get_current_limit_t)(const struct device *dev,
86 int32_t *curr_ua);
87typedef int (*regulator_set_mode_t)(const struct device *dev,
88 regulator_mode_t mode);
89typedef int (*regulator_get_mode_t)(const struct device *dev,
90 regulator_mode_t *mode);
91typedef int (*regulator_set_active_discharge_t)(const struct device *dev,
92 bool active_discharge);
93typedef int (*regulator_get_active_discharge_t)(const struct device *dev,
94 bool *active_discharge);
95typedef int (*regulator_get_error_flags_t)(
96 const struct device *dev, regulator_error_flags_t *flags);
97
99__subsystem struct regulator_driver_api {
100 regulator_enable_t enable;
101 regulator_disable_t disable;
102 regulator_count_voltages_t count_voltages;
103 regulator_list_voltage_t list_voltage;
104 regulator_set_voltage_t set_voltage;
105 regulator_get_voltage_t get_voltage;
106 regulator_count_current_limits_t count_current_limits;
107 regulator_list_current_limit_t list_current_limit;
108 regulator_set_current_limit_t set_current_limit;
109 regulator_get_current_limit_t get_current_limit;
110 regulator_set_mode_t set_mode;
111 regulator_get_mode_t get_mode;
112 regulator_set_active_discharge_t set_active_discharge;
113 regulator_get_active_discharge_t get_active_discharge;
114 regulator_get_error_flags_t get_error_flags;
115};
116
123#define REGULATOR_ALWAYS_ON BIT(0)
125#define REGULATOR_BOOT_ON BIT(1)
127#define REGULATOR_INIT_ENABLED (REGULATOR_ALWAYS_ON | REGULATOR_BOOT_ON)
129#define REGULATOR_ACTIVE_DISCHARGE_MASK GENMASK(3, 2)
131#define REGULATOR_ACTIVE_DISCHARGE_POS 2
133#define REGULATOR_ACTIVE_DISCHARGE_DISABLE 0
135#define REGULATOR_ACTIVE_DISCHARGE_ENABLE 1
137#define REGULATOR_ACTIVE_DISCHARGE_DEFAULT 2
139#define REGULATOR_ACTIVE_DISCHARGE_SET_BITS(x) \
140 (((x) << REGULATOR_ACTIVE_DISCHARGE_POS) & REGULATOR_ACTIVE_DISCHARGE_MASK)
142#define REGULATOR_ACTIVE_DISCHARGE_GET_BITS(x) \
143 (((x) & REGULATOR_ACTIVE_DISCHARGE_MASK) >> REGULATOR_ACTIVE_DISCHARGE_POS)
144
148#define REGULATOR_INITIAL_MODE_UNKNOWN UINT8_MAX
149
155struct regulator_common_config {
157 int32_t min_uv;
159 int32_t max_uv;
161 int32_t init_uv;
163 int32_t min_ua;
165 int32_t max_ua;
167 int32_t init_ua;
169 uint32_t startup_delay_us;
171 uint32_t off_on_delay_us;
173 const regulator_mode_t *allowed_modes;
175 uint8_t allowed_modes_cnt;
177 regulator_mode_t initial_mode;
180};
181
187#define REGULATOR_DT_COMMON_CONFIG_INIT(node_id) \
188 { \
189 .min_uv = DT_PROP_OR(node_id, regulator_min_microvolt, \
190 INT32_MIN), \
191 .max_uv = DT_PROP_OR(node_id, regulator_max_microvolt, \
192 INT32_MAX), \
193 .init_uv = DT_PROP_OR(node_id, regulator_init_microvolt, \
194 INT32_MIN), \
195 .min_ua = DT_PROP_OR(node_id, regulator_min_microamp, \
196 INT32_MIN), \
197 .max_ua = DT_PROP_OR(node_id, regulator_max_microamp, \
198 INT32_MAX), \
199 .init_ua = DT_PROP_OR(node_id, regulator_init_microamp, \
200 INT32_MIN), \
201 .startup_delay_us = DT_PROP_OR(node_id, startup_delay_us, 0), \
202 .off_on_delay_us = DT_PROP_OR(node_id, off_on_delay_us, 0), \
203 .allowed_modes = (const regulator_mode_t []) \
204 DT_PROP_OR(node_id, regulator_allowed_modes, {}), \
205 .allowed_modes_cnt = \
206 DT_PROP_LEN_OR(node_id, regulator_allowed_modes, 0), \
207 .initial_mode = DT_PROP_OR(node_id, regulator_initial_mode, \
208 REGULATOR_INITIAL_MODE_UNKNOWN), \
209 .flags = ((DT_PROP_OR(node_id, regulator_always_on, 0U) * \
210 REGULATOR_ALWAYS_ON) | \
211 (DT_PROP_OR(node_id, regulator_boot_on, 0U) * \
212 REGULATOR_BOOT_ON) | \
213 (REGULATOR_ACTIVE_DISCHARGE_SET_BITS( \
214 DT_PROP_OR(node_id, regulator_active_discharge, \
215 REGULATOR_ACTIVE_DISCHARGE_DEFAULT)))), \
216 }
217
223#define REGULATOR_DT_INST_COMMON_CONFIG_INIT(inst) \
224 REGULATOR_DT_COMMON_CONFIG_INIT(DT_DRV_INST(inst))
225
231struct regulator_common_data {
232#if defined(CONFIG_REGULATOR_THREAD_SAFE_REFCNT) || defined(__DOXYGEN__)
234 struct k_mutex lock;
235#endif
237 int refcnt;
238};
239
247void regulator_common_data_init(const struct device *dev);
248
270int regulator_common_init(const struct device *dev, bool is_enabled);
271
279static inline bool regulator_common_is_init_enabled(const struct device *dev)
280{
281 const struct regulator_common_config *config =
282 (const struct regulator_common_config *)dev->config;
283
284 return (config->flags & REGULATOR_INIT_ENABLED) != 0U;
285}
286
296static inline int regulator_common_get_min_voltage(const struct device *dev, int32_t *min_uv)
297{
298 const struct regulator_common_config *config =
299 (const struct regulator_common_config *)dev->config;
300
301 if (config->min_uv == INT32_MIN) {
302 return -ENOENT;
303 }
304
305 *min_uv = config->min_uv;
306 return 0;
307}
308
336static inline int regulator_parent_dvs_state_set(const struct device *dev,
338{
339 const struct regulator_parent_driver_api *api =
340 (const struct regulator_parent_driver_api *)dev->api;
341
342 if (api->dvs_state_set == NULL) {
343 return -ENOSYS;
344 }
345
346 return api->dvs_state_set(dev, state);
347}
348
363static inline int regulator_parent_ship_mode(const struct device *dev)
364{
365 const struct regulator_parent_driver_api *api =
366 (const struct regulator_parent_driver_api *)dev->api;
367
368 if (api->ship_mode == NULL) {
369 return -ENOSYS;
370 }
371
372 return api->ship_mode(dev);
373}
374
391int regulator_enable(const struct device *dev);
392
401bool regulator_is_enabled(const struct device *dev);
402
419int regulator_disable(const struct device *dev);
420
432static inline unsigned int regulator_count_voltages(const struct device *dev)
433{
434 const struct regulator_driver_api *api =
435 (const struct regulator_driver_api *)dev->api;
436
437 if (api->count_voltages == NULL) {
438 return 0U;
439 }
440
441 return api->count_voltages(dev);
442}
443
459static inline int regulator_list_voltage(const struct device *dev,
460 unsigned int idx, int32_t *volt_uv)
461{
462 const struct regulator_driver_api *api =
463 (const struct regulator_driver_api *)dev->api;
464
465 if (api->list_voltage == NULL) {
466 return -EINVAL;
467 }
468
469 return api->list_voltage(dev, idx, volt_uv);
470}
471
482bool regulator_is_supported_voltage(const struct device *dev, int32_t min_uv,
483 int32_t max_uv);
484
503int regulator_set_voltage(const struct device *dev, int32_t min_uv,
504 int32_t max_uv);
505
516static inline int regulator_get_voltage(const struct device *dev,
517 int32_t *volt_uv)
518{
519 const struct regulator_driver_api *api =
520 (const struct regulator_driver_api *)dev->api;
521
522 if (api->get_voltage == NULL) {
523 return -ENOSYS;
524 }
525
526 return api->get_voltage(dev, volt_uv);
527}
528
540static inline unsigned int regulator_count_current_limits(const struct device *dev)
541{
542 const struct regulator_driver_api *api =
543 (const struct regulator_driver_api *)dev->api;
544
545 if (api->count_current_limits == NULL) {
546 return 0U;
547 }
548
549 return api->count_current_limits(dev);
550}
551
567static inline int regulator_list_current_limit(const struct device *dev,
568 unsigned int idx, int32_t *current_ua)
569{
570 const struct regulator_driver_api *api =
571 (const struct regulator_driver_api *)dev->api;
572
573 if (api->list_current_limit == NULL) {
574 return -EINVAL;
575 }
576
577 return api->list_current_limit(dev, idx, current_ua);
578}
579
597int regulator_set_current_limit(const struct device *dev, int32_t min_ua,
598 int32_t max_ua);
599
610static inline int regulator_get_current_limit(const struct device *dev,
611 int32_t *curr_ua)
612{
613 const struct regulator_driver_api *api =
614 (const struct regulator_driver_api *)dev->api;
615
616 if (api->get_current_limit == NULL) {
617 return -ENOSYS;
618 }
619
620 return api->get_current_limit(dev, curr_ua);
621}
622
639int regulator_set_mode(const struct device *dev, regulator_mode_t mode);
640
651static inline int regulator_get_mode(const struct device *dev,
652 regulator_mode_t *mode)
653{
654 const struct regulator_driver_api *api =
655 (const struct regulator_driver_api *)dev->api;
656
657 if (api->get_mode == NULL) {
658 return -ENOSYS;
659 }
660
661 return api->get_mode(dev, mode);
662}
663
674static inline int regulator_set_active_discharge(const struct device *dev,
675 bool active_discharge)
676{
677 const struct regulator_driver_api *api =
678 (const struct regulator_driver_api *)dev->api;
679
680 if (api->set_active_discharge == NULL) {
681 return -ENOSYS;
682 }
683
684 return api->set_active_discharge(dev, active_discharge);
685}
686
697static inline int regulator_get_active_discharge(const struct device *dev,
698 bool *active_discharge)
699{
700 const struct regulator_driver_api *api =
701 (const struct regulator_driver_api *)dev->api;
702
703 if (api->get_active_discharge == NULL) {
704 return -ENOSYS;
705 }
706
707 return api->get_active_discharge(dev, active_discharge);
708}
709
720static inline int regulator_get_error_flags(const struct device *dev,
722{
723 const struct regulator_driver_api *api =
724 (const struct regulator_driver_api *)dev->api;
725
726 if (api->get_error_flags == NULL) {
727 return -ENOSYS;
728 }
729
730 return api->get_error_flags(dev, flags);
731}
732
733#ifdef __cplusplus
734}
735#endif
736
739#endif /* ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_ */
Devicetree main header.
System error numbers.
int regulator_enable(const struct device *dev)
Enable a regulator.
int regulator_set_mode(const struct device *dev, regulator_mode_t mode)
Set mode.
uint8_t regulator_mode_t
Opaque type to store regulator modes.
Definition: regulator.h:38
static unsigned int regulator_count_current_limits(const struct device *dev)
Obtain the number of supported current limit levels.
Definition: regulator.h:540
bool regulator_is_enabled(const struct device *dev)
Check if a regulator is enabled.
int regulator_set_voltage(const struct device *dev, int32_t min_uv, int32_t max_uv)
Set the output voltage.
int regulator_set_current_limit(const struct device *dev, int32_t min_ua, int32_t max_ua)
Set output current limit.
bool regulator_is_supported_voltage(const struct device *dev, int32_t min_uv, int32_t max_uv)
Check if a voltage within a window is supported.
uint8_t regulator_error_flags_t
Opaque bit map for regulator error flags (see REGULATOR_ERRORS)
Definition: regulator.h:41
static int regulator_get_active_discharge(const struct device *dev, bool *active_discharge)
Get active discharge setting.
Definition: regulator.h:697
static int regulator_list_voltage(const struct device *dev, unsigned int idx, int32_t *volt_uv)
Obtain the value of a voltage given an index.
Definition: regulator.h:459
static int regulator_get_current_limit(const struct device *dev, int32_t *curr_ua)
Get output current limit.
Definition: regulator.h:610
static int regulator_set_active_discharge(const struct device *dev, bool active_discharge)
Set active discharge setting.
Definition: regulator.h:674
static int regulator_get_error_flags(const struct device *dev, regulator_error_flags_t *flags)
Get active error flags.
Definition: regulator.h:720
static unsigned int regulator_count_voltages(const struct device *dev)
Obtain the number of supported voltage levels.
Definition: regulator.h:432
uint8_t regulator_dvs_state_t
Opaque type to store regulator DVS states.
Definition: regulator.h:35
static int regulator_get_mode(const struct device *dev, regulator_mode_t *mode)
Get mode.
Definition: regulator.h:651
static int regulator_get_voltage(const struct device *dev, int32_t *volt_uv)
Obtain output voltage.
Definition: regulator.h:516
int regulator_disable(const struct device *dev)
Disable a regulator.
static int regulator_list_current_limit(const struct device *dev, unsigned int idx, int32_t *current_ua)
Obtain the value of a current limit given an index.
Definition: regulator.h:567
static int regulator_parent_dvs_state_set(const struct device *dev, regulator_dvs_state_t state)
Set a DVS state.
Definition: regulator.h:336
static int regulator_parent_ship_mode(const struct device *dev)
Enter ship mode.
Definition: regulator.h:363
#define ENOENT
No such file or directory.
Definition: errno.h:41
#define EINVAL
Invalid argument.
Definition: errno.h:61
#define ENOSYS
Function not implemented.
Definition: errno.h:83
Public kernel APIs.
flags
Definition: parser.h:96
state
Definition: parser_state.h:29
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
#define INT32_MIN
Definition: stdint.h:24
Runtime device structure (in ROM) per driver instance.
Definition: device.h:387
const void * api
Address of the API structure exposed by the device instance.
Definition: device.h:393
const void * config
Address of device instance config information.
Definition: device.h:391
Mutex Structure.
Definition: kernel.h:2900
Macro utilities.