Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
15
16#ifndef ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_
17#define ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_
18
27
28#include <errno.h>
29#include <stdint.h>
30
31#include <zephyr/device.h>
32#include <zephyr/devicetree.h>
33#ifdef CONFIG_REGULATOR_THREAD_SAFE_REFCNT
34#include <zephyr/kernel.h>
35#endif
37
38#ifdef __cplusplus
39extern "C" {
40#endif
41
44
47
50
56
58#define REGULATOR_ERROR_OVER_VOLTAGE BIT(0)
60#define REGULATOR_ERROR_OVER_CURRENT BIT(1)
62#define REGULATOR_ERROR_OVER_TEMP BIT(2)
63
65
75
81
89typedef void (*regulator_callback_t)(const struct device *dev,
90 const struct regulator_event *const evt,
91 const void *const user_data);
92
94
95typedef int (*regulator_dvs_state_set_t)(const struct device *dev,
97
98typedef int (*regulator_ship_mode_t)(const struct device *dev);
99
101__subsystem struct regulator_parent_driver_api {
102 regulator_dvs_state_set_t dvs_state_set;
103 regulator_ship_mode_t ship_mode;
104};
105
106typedef int (*regulator_enable_t)(const struct device *dev);
107typedef int (*regulator_disable_t)(const struct device *dev);
108typedef unsigned int (*regulator_count_voltages_t)(const struct device *dev);
109typedef int (*regulator_list_voltage_t)(const struct device *dev,
110 unsigned int idx, int32_t *volt_uv);
111typedef int (*regulator_set_voltage_t)(const struct device *dev, int32_t min_uv,
112 int32_t max_uv);
113typedef int (*regulator_get_voltage_t)(const struct device *dev,
114 int32_t *volt_uv);
115typedef unsigned int (*regulator_count_current_limits_t)(const struct device *dev);
116typedef int (*regulator_list_current_limit_t)(const struct device *dev,
117 unsigned int idx, int32_t *current_ua);
118typedef int (*regulator_set_current_limit_t)(const struct device *dev,
119 int32_t min_ua, int32_t max_ua);
120typedef int (*regulator_get_current_limit_t)(const struct device *dev,
121 int32_t *curr_ua);
122typedef int (*regulator_set_mode_t)(const struct device *dev,
123 regulator_mode_t mode);
124typedef int (*regulator_get_mode_t)(const struct device *dev,
125 regulator_mode_t *mode);
126typedef int (*regulator_set_active_discharge_t)(const struct device *dev,
127 bool active_discharge);
128typedef int (*regulator_get_active_discharge_t)(const struct device *dev,
129 bool *active_discharge);
130typedef int (*regulator_get_error_flags_t)(
131 const struct device *dev, regulator_error_flags_t *flags);
132typedef int (*regulator_set_callback_t)(const struct device *dev,
133 regulator_callback_t cb, const void *const user_data);
134
136__subsystem struct regulator_driver_api {
137 regulator_enable_t enable;
138 regulator_disable_t disable;
139 regulator_count_voltages_t count_voltages;
140 regulator_list_voltage_t list_voltage;
141 regulator_set_voltage_t set_voltage;
142 regulator_get_voltage_t get_voltage;
143 regulator_count_current_limits_t count_current_limits;
144 regulator_list_current_limit_t list_current_limit;
145 regulator_set_current_limit_t set_current_limit;
146 regulator_get_current_limit_t get_current_limit;
147 regulator_set_mode_t set_mode;
148 regulator_get_mode_t get_mode;
149 regulator_set_active_discharge_t set_active_discharge;
150 regulator_get_active_discharge_t get_active_discharge;
151 regulator_get_error_flags_t get_error_flags;
152 regulator_set_callback_t set_callback;
153};
154
161#define REGULATOR_ALWAYS_ON BIT(0)
163#define REGULATOR_BOOT_ON BIT(1)
165#define REGULATOR_INIT_ENABLED (REGULATOR_ALWAYS_ON | REGULATOR_BOOT_ON)
167#define REGULATOR_ACTIVE_DISCHARGE_MASK GENMASK(3, 2)
169#define REGULATOR_ACTIVE_DISCHARGE_POS 2
171#define REGULATOR_ACTIVE_DISCHARGE_DISABLE 0
173#define REGULATOR_ACTIVE_DISCHARGE_ENABLE 1
175#define REGULATOR_ACTIVE_DISCHARGE_DEFAULT 2
177#define REGULATOR_ACTIVE_DISCHARGE_SET_BITS(x) \
178 (((x) << REGULATOR_ACTIVE_DISCHARGE_POS) & REGULATOR_ACTIVE_DISCHARGE_MASK)
180#define REGULATOR_ACTIVE_DISCHARGE_GET_BITS(x) \
181 (((x) & REGULATOR_ACTIVE_DISCHARGE_MASK) >> REGULATOR_ACTIVE_DISCHARGE_POS)
183#define REGULATOR_BOOT_OFF BIT(4)
184
186
188#define REGULATOR_INITIAL_MODE_UNKNOWN UINT8_MAX
189
195struct regulator_common_config {
197 int32_t min_uv;
199 int32_t max_uv;
201 int32_t init_uv;
203 int32_t min_ua;
205 int32_t max_ua;
207 int32_t init_ua;
209 uint32_t startup_delay_us;
211 uint32_t off_on_delay_us;
213 const regulator_mode_t *allowed_modes;
215 uint8_t allowed_modes_cnt;
217 regulator_mode_t initial_mode;
220};
221
227#define REGULATOR_DT_COMMON_CONFIG_INIT(node_id) \
228 { \
229 .min_uv = DT_PROP_OR(node_id, regulator_min_microvolt, \
230 INT32_MIN), \
231 .max_uv = DT_PROP_OR(node_id, regulator_max_microvolt, \
232 INT32_MAX), \
233 .init_uv = DT_PROP_OR(node_id, regulator_init_microvolt, \
234 INT32_MIN), \
235 .min_ua = DT_PROP_OR(node_id, regulator_min_microamp, \
236 INT32_MIN), \
237 .max_ua = DT_PROP_OR(node_id, regulator_max_microamp, \
238 INT32_MAX), \
239 .init_ua = DT_PROP_OR(node_id, regulator_init_microamp, \
240 INT32_MIN), \
241 .startup_delay_us = DT_PROP_OR(node_id, startup_delay_us, 0), \
242 .off_on_delay_us = DT_PROP_OR(node_id, off_on_delay_us, 0), \
243 .allowed_modes = (const regulator_mode_t []) \
244 DT_PROP_OR(node_id, regulator_allowed_modes, {}), \
245 .allowed_modes_cnt = \
246 DT_PROP_LEN_OR(node_id, regulator_allowed_modes, 0), \
247 .initial_mode = DT_PROP_OR(node_id, regulator_initial_mode, \
248 REGULATOR_INITIAL_MODE_UNKNOWN), \
249 .flags = ((DT_PROP_OR(node_id, regulator_always_on, 0U) * \
250 REGULATOR_ALWAYS_ON) | \
251 (DT_PROP_OR(node_id, regulator_boot_on, 0U) * \
252 REGULATOR_BOOT_ON) | \
253 (REGULATOR_ACTIVE_DISCHARGE_SET_BITS( \
254 DT_PROP_OR(node_id, regulator_active_discharge, \
255 REGULATOR_ACTIVE_DISCHARGE_DEFAULT))) | \
256 (DT_PROP_OR(node_id, regulator_boot_off, 0U) * \
257 REGULATOR_BOOT_OFF)), \
258 }
259
265#define REGULATOR_DT_INST_COMMON_CONFIG_INIT(inst) \
266 REGULATOR_DT_COMMON_CONFIG_INIT(DT_DRV_INST(inst))
267
273struct regulator_common_data {
274#if defined(CONFIG_REGULATOR_THREAD_SAFE_REFCNT) || defined(__DOXYGEN__)
276 struct k_mutex lock;
277#endif
279 int refcnt;
280};
281
289void regulator_common_data_init(const struct device *dev);
290
313int regulator_common_init(const struct device *dev, bool is_enabled);
314
322static inline bool regulator_common_is_init_enabled(const struct device *dev)
323{
324 const struct regulator_common_config *config =
325 (const struct regulator_common_config *)dev->config;
326
327 return (config->flags & REGULATOR_INIT_ENABLED) != 0U;
328}
329
339static inline int regulator_common_get_min_voltage(const struct device *dev, int32_t *min_uv)
340{
341 const struct regulator_common_config *config =
342 (const struct regulator_common_config *)dev->config;
343
344 if (config->min_uv == INT32_MIN) {
345 return -ENOENT;
346 }
347
348 *min_uv = config->min_uv;
349 return 0;
350}
351
361static inline int regulator_common_get_max_voltage(const struct device *dev, int32_t *max_uv)
362{
363 const struct regulator_common_config *config =
364 (const struct regulator_common_config *)dev->config;
365
366 if (config->max_uv == INT32_MAX) {
367 return -ENOENT;
368 }
369
370 *max_uv = config->max_uv;
371 return 0;
372}
373
375
381
401static inline int regulator_parent_dvs_state_set(const struct device *dev,
403{
404 const struct regulator_parent_driver_api *api = DEVICE_API_GET(regulator_parent, dev);
405
406 if (api->dvs_state_set == NULL) {
407 return -ENOSYS;
408 }
409
410 return api->dvs_state_set(dev, state);
411}
412
427static inline int regulator_parent_ship_mode(const struct device *dev)
428{
429 const struct regulator_parent_driver_api *api = DEVICE_API_GET(regulator_parent, dev);
430
431 if (api->ship_mode == NULL) {
432 return -ENOSYS;
433 }
434
435 return api->ship_mode(dev);
436}
437
439
454int regulator_enable(const struct device *dev);
455
464bool regulator_is_enabled(const struct device *dev);
465
482int regulator_disable(const struct device *dev);
483
495static inline unsigned int regulator_count_voltages(const struct device *dev)
496{
497 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
498
499 if (api->count_voltages == NULL) {
500 return 0U;
501 }
502
503 return api->count_voltages(dev);
504}
505
521static inline int regulator_list_voltage(const struct device *dev,
522 unsigned int idx, int32_t *volt_uv)
523{
524 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
525
526 if (api->list_voltage == NULL) {
527 return -EINVAL;
528 }
529
530 return api->list_voltage(dev, idx, volt_uv);
531}
532
543bool regulator_is_supported_voltage(const struct device *dev, int32_t min_uv,
544 int32_t max_uv);
545
564int regulator_set_voltage(const struct device *dev, int32_t min_uv,
565 int32_t max_uv);
566
577static inline int regulator_get_voltage(const struct device *dev,
578 int32_t *volt_uv)
579{
580 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
581
582 if (api->get_voltage == NULL) {
583 return -ENOSYS;
584 }
585
586 return api->get_voltage(dev, volt_uv);
587}
588
600static inline unsigned int regulator_count_current_limits(const struct device *dev)
601{
602 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
603
604 if (api->count_current_limits == NULL) {
605 return 0U;
606 }
607
608 return api->count_current_limits(dev);
609}
610
626static inline int regulator_list_current_limit(const struct device *dev,
627 unsigned int idx, int32_t *current_ua)
628{
629 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
630
631 if (api->list_current_limit == NULL) {
632 return -EINVAL;
633 }
634
635 return api->list_current_limit(dev, idx, current_ua);
636}
637
655int regulator_set_current_limit(const struct device *dev, int32_t min_ua,
656 int32_t max_ua);
657
668static inline int regulator_get_current_limit(const struct device *dev,
669 int32_t *curr_ua)
670{
671 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
672
673 if (api->get_current_limit == NULL) {
674 return -ENOSYS;
675 }
676
677 return api->get_current_limit(dev, curr_ua);
678}
679
696int regulator_set_mode(const struct device *dev, regulator_mode_t mode);
697
708static inline int regulator_get_mode(const struct device *dev,
709 regulator_mode_t *mode)
710{
711 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
712
713 if (api->get_mode == NULL) {
714 return -ENOSYS;
715 }
716
717 return api->get_mode(dev, mode);
718}
719
730static inline int regulator_set_active_discharge(const struct device *dev,
731 bool active_discharge)
732{
733 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
734
735 if (api->set_active_discharge == NULL) {
736 return -ENOSYS;
737 }
738
739 return api->set_active_discharge(dev, active_discharge);
740}
741
752static inline int regulator_get_active_discharge(const struct device *dev,
753 bool *active_discharge)
754{
755 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
756
757 if (api->get_active_discharge == NULL) {
758 return -ENOSYS;
759 }
760
761 return api->get_active_discharge(dev, active_discharge);
762}
763
774static inline int regulator_get_error_flags(const struct device *dev,
776{
777 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
778
779 if (api->get_error_flags == NULL) {
780 return -ENOSYS;
781 }
782
783 return api->get_error_flags(dev, flags);
784}
785
800static inline int regulator_set_callback(const struct device *dev,
802 const void *const user_data)
803{
804 const struct regulator_driver_api *api = DEVICE_API_GET(regulator, dev);
805
806 if (api->set_callback == NULL) {
807 return -ENOSYS;
808 }
809
810 return api->set_callback(dev, cb, user_data);
811}
812
813#ifdef __cplusplus
814}
815#endif
816
818
819#endif /* ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_ */
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1425
Devicetree main header.
System error numbers.
void(* regulator_callback_t)(const struct device *dev, const struct regulator_event *const evt, const void *const user_data)
Regulator callback function signature.
Definition regulator.h:89
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:46
static unsigned int regulator_count_current_limits(const struct device *dev)
Obtain the number of supported current limit levels.
Definition regulator.h:600
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:49
static int regulator_get_active_discharge(const struct device *dev, bool *active_discharge)
Get active discharge setting.
Definition regulator.h:752
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:521
static int regulator_get_current_limit(const struct device *dev, int32_t *curr_ua)
Get output current limit.
Definition regulator.h:668
static int regulator_set_active_discharge(const struct device *dev, bool active_discharge)
Set active discharge setting.
Definition regulator.h:730
static int regulator_get_error_flags(const struct device *dev, regulator_error_flags_t *flags)
Get active error flags.
Definition regulator.h:774
static unsigned int regulator_count_voltages(const struct device *dev)
Obtain the number of supported voltage levels.
Definition regulator.h:495
uint8_t regulator_dvs_state_t
Opaque type to store regulator DVS states.
Definition regulator.h:43
static int regulator_get_mode(const struct device *dev, regulator_mode_t *mode)
Get mode.
Definition regulator.h:708
static int regulator_get_voltage(const struct device *dev, int32_t *volt_uv)
Obtain output voltage.
Definition regulator.h:577
int regulator_disable(const struct device *dev)
Disable a regulator.
regulator_event_type
Regulator event types.
Definition regulator.h:69
static int regulator_set_callback(const struct device *dev, regulator_callback_t cb, const void *const user_data)
Set event handler function.
Definition regulator.h:800
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:626
@ REGULATOR_VOLTAGE_DETECTED
Regulator voltage is detected.
Definition regulator.h:71
@ REGULATOR_VOLTAGE_REMOVED
Regulator voltage is removed.
Definition regulator.h:73
static int regulator_parent_dvs_state_set(const struct device *dev, regulator_dvs_state_t state)
Set a DVS state.
Definition regulator.h:401
static int regulator_parent_ship_mode(const struct device *dev)
Enter ship mode.
Definition regulator.h:427
#define ENOENT
No such file or directory.
Definition errno.h:40
#define EINVAL
Invalid argument.
Definition errno.h:60
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
Public kernel APIs.
flags
Definition parser.h:97
state
Definition parser_state.h:29
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__INT32_TYPE__ int32_t
Definition stdint.h:74
#define INT32_MAX
Definition stdint.h:18
__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:513
const void * config
Address of device instance config information.
Definition device.h:517
Regulator event structure.
Definition regulator.h:77
enum regulator_event_type type
Event type.
Definition regulator.h:79
Macro utilities.