Zephyr Project API  3.4.0
A Scalable Open Source RTOS
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 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_
9#define ZEPHYR_INCLUDE_DRIVERS_REGULATOR_H_
10
18#include <errno.h>
19#include <stdint.h>
20
21#include <zephyr/device.h>
22#include <zephyr/devicetree.h>
23#ifdef CONFIG_REGULATOR_THREAD_SAFE_REFCNT
24#include <zephyr/kernel.h>
25#endif
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
34
37
40
48#define REGULATOR_ERROR_OVER_VOLTAGE BIT(0)
50#define REGULATOR_ERROR_OVER_CURRENT BIT(1)
52#define REGULATOR_ERROR_OVER_TEMP BIT(2)
53
58typedef int (*regulator_dvs_state_set_t)(const struct device *dev,
60
62__subsystem struct regulator_parent_driver_api {
63 regulator_dvs_state_set_t dvs_state_set;
64};
65
66typedef int (*regulator_enable_t)(const struct device *dev);
67typedef int (*regulator_disable_t)(const struct device *dev);
68typedef unsigned int (*regulator_count_voltages_t)(const struct device *dev);
69typedef int (*regulator_list_voltage_t)(const struct device *dev,
70 unsigned int idx, int32_t *volt_uv);
71typedef int (*regulator_set_voltage_t)(const struct device *dev, int32_t min_uv,
72 int32_t max_uv);
73typedef int (*regulator_get_voltage_t)(const struct device *dev,
74 int32_t *volt_uv);
75typedef int (*regulator_set_current_limit_t)(const struct device *dev,
76 int32_t min_ua, int32_t max_ua);
77typedef int (*regulator_get_current_limit_t)(const struct device *dev,
78 int32_t *curr_ua);
79typedef int (*regulator_set_mode_t)(const struct device *dev,
80 regulator_mode_t mode);
81typedef int (*regulator_get_mode_t)(const struct device *dev,
82 regulator_mode_t *mode);
83typedef int (*regulator_get_error_flags_t)(
84 const struct device *dev, regulator_error_flags_t *flags);
85
87__subsystem struct regulator_driver_api {
88 regulator_enable_t enable;
89 regulator_disable_t disable;
90 regulator_count_voltages_t count_voltages;
91 regulator_list_voltage_t list_voltage;
92 regulator_set_voltage_t set_voltage;
93 regulator_get_voltage_t get_voltage;
94 regulator_set_current_limit_t set_current_limit;
95 regulator_get_current_limit_t get_current_limit;
96 regulator_set_mode_t set_mode;
97 regulator_get_mode_t get_mode;
98 regulator_get_error_flags_t get_error_flags;
99};
100
107#define REGULATOR_ALWAYS_ON BIT(0)
109#define REGULATOR_BOOT_ON BIT(1)
111#define REGULATOR_INIT_ENABLED (REGULATOR_ALWAYS_ON | REGULATOR_BOOT_ON)
112
116#define REGULATOR_INITIAL_MODE_UNKNOWN UINT8_MAX
117
123struct regulator_common_config {
125 int32_t min_uv;
127 int32_t max_uv;
129 int32_t init_uv;
131 int32_t min_ua;
133 int32_t max_ua;
135 const regulator_mode_t *allowed_modes;
137 uint8_t allowed_modes_cnt;
139 regulator_mode_t initial_mode;
142};
143
149#define REGULATOR_DT_COMMON_CONFIG_INIT(node_id) \
150 { \
151 .min_uv = DT_PROP_OR(node_id, regulator_min_microvolt, \
152 INT32_MIN), \
153 .max_uv = DT_PROP_OR(node_id, regulator_max_microvolt, \
154 INT32_MAX), \
155 .init_uv = DT_PROP_OR(node_id, regulator_init_microvolt, \
156 INT32_MIN), \
157 .min_ua = DT_PROP_OR(node_id, regulator_min_microamp, \
158 INT32_MIN), \
159 .max_ua = DT_PROP_OR(node_id, regulator_max_microamp, \
160 INT32_MAX), \
161 .allowed_modes = (const regulator_mode_t []) \
162 DT_PROP_OR(node_id, regulator_allowed_modes, {}), \
163 .allowed_modes_cnt = \
164 DT_PROP_LEN_OR(node_id, regulator_allowed_modes, 0), \
165 .initial_mode = DT_PROP_OR(node_id, regulator_initial_mode, \
166 REGULATOR_INITIAL_MODE_UNKNOWN), \
167 .flags = ((DT_PROP_OR(node_id, regulator_always_on, 0U) * \
168 REGULATOR_ALWAYS_ON) | \
169 (DT_PROP_OR(node_id, regulator_boot_on, 0U) * \
170 REGULATOR_BOOT_ON)), \
171 }
172
178#define REGULATOR_DT_INST_COMMON_CONFIG_INIT(inst) \
179 REGULATOR_DT_COMMON_CONFIG_INIT(DT_DRV_INST(inst))
180
186struct regulator_common_data {
187#if defined(CONFIG_REGULATOR_THREAD_SAFE_REFCNT) || defined(__DOXYGEN__)
189 struct k_mutex lock;
190#endif
192 int refcnt;
193};
194
202void regulator_common_data_init(const struct device *dev);
203
225int regulator_common_init(const struct device *dev, bool is_enabled);
226
234static inline bool regulator_common_is_init_enabled(const struct device *dev)
235{
236 const struct regulator_common_config *config =
237 (const struct regulator_common_config *)dev->config;
238
239 return (config->flags & REGULATOR_INIT_ENABLED) != 0U;
240}
241
269static inline int regulator_parent_dvs_state_set(const struct device *dev,
271{
272 const struct regulator_parent_driver_api *api =
273 (const struct regulator_parent_driver_api *)dev->api;
274
275 if (api->dvs_state_set == NULL) {
276 return -ENOSYS;
277 }
278
279 return api->dvs_state_set(dev, state);
280}
281
297int regulator_enable(const struct device *dev);
298
307bool regulator_is_enabled(const struct device *dev);
308
324int regulator_disable(const struct device *dev);
325
337static inline unsigned int regulator_count_voltages(const struct device *dev)
338{
339 const struct regulator_driver_api *api =
340 (const struct regulator_driver_api *)dev->api;
341
342 if (api->count_voltages == NULL) {
343 return 0U;
344 }
345
346 return api->count_voltages(dev);
347}
348
364static inline int regulator_list_voltage(const struct device *dev,
365 unsigned int idx, int32_t *volt_uv)
366{
367 const struct regulator_driver_api *api =
368 (const struct regulator_driver_api *)dev->api;
369
370 if (api->list_voltage == NULL) {
371 return -EINVAL;
372 }
373
374 return api->list_voltage(dev, idx, volt_uv);
375}
376
387bool regulator_is_supported_voltage(const struct device *dev, int32_t min_uv,
388 int32_t max_uv);
389
408int regulator_set_voltage(const struct device *dev, int32_t min_uv,
409 int32_t max_uv);
410
421static inline int regulator_get_voltage(const struct device *dev,
422 int32_t *volt_uv)
423{
424 const struct regulator_driver_api *api =
425 (const struct regulator_driver_api *)dev->api;
426
427 if (api->get_voltage == NULL) {
428 return -ENOSYS;
429 }
430
431 return api->get_voltage(dev, volt_uv);
432}
433
451int regulator_set_current_limit(const struct device *dev, int32_t min_ua,
452 int32_t max_ua);
453
464static inline int regulator_get_current_limit(const struct device *dev,
465 int32_t *curr_ua)
466{
467 const struct regulator_driver_api *api =
468 (const struct regulator_driver_api *)dev->api;
469
470 if (api->get_current_limit == NULL) {
471 return -ENOSYS;
472 }
473
474 return api->get_current_limit(dev, curr_ua);
475}
476
493int regulator_set_mode(const struct device *dev, regulator_mode_t mode);
494
505static inline int regulator_get_mode(const struct device *dev,
506 regulator_mode_t *mode)
507{
508 const struct regulator_driver_api *api =
509 (const struct regulator_driver_api *)dev->api;
510
511 if (api->get_mode == NULL) {
512 return -ENOSYS;
513 }
514
515 return api->get_mode(dev, mode);
516}
517
528static inline int regulator_get_error_flags(const struct device *dev,
530{
531 const struct regulator_driver_api *api =
532 (const struct regulator_driver_api *)dev->api;
533
534 if (api->get_error_flags == NULL) {
535 return -ENOSYS;
536 }
537
538 return api->get_error_flags(dev, flags);
539}
540
541#ifdef __cplusplus
542}
543#endif
544
547#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
Definition: regulator.h:36
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
Definition: regulator.h:39
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:364
static int regulator_get_current_limit(const struct device *dev, int32_t *curr_ua)
Get output current limit.
Definition: regulator.h:464
static int regulator_get_error_flags(const struct device *dev, regulator_error_flags_t *flags)
Get active error flags.
Definition: regulator.h:528
static unsigned int regulator_count_voltages(const struct device *dev)
Obtain the number of supported voltage levels.
Definition: regulator.h:337
uint8_t regulator_dvs_state_t
Definition: regulator.h:33
static int regulator_get_mode(const struct device *dev, regulator_mode_t *mode)
Get mode.
Definition: regulator.h:505
static int regulator_get_voltage(const struct device *dev, int32_t *volt_uv)
Obtain output voltage.
Definition: regulator.h:421
int regulator_disable(const struct device *dev)
Disable a regulator.
static int regulator_parent_dvs_state_set(const struct device *dev, regulator_dvs_state_t state)
Set a DVS state.
Definition: regulator.h:269
#define EINVAL
Definition: errno.h:61
#define ENOSYS
Definition: errno.h:83
Public kernel APIs.
flags
Definition: parser.h:96
state
Definition: parser_state.h:29
static struct k_spinlock lock
Definition: spinlock_error_case.c:13
__INT32_TYPE__ int32_t
Definition: stdint.h:74
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
Runtime device structure (in ROM) per driver instance.
Definition: device.h:380
const void * api
Definition: device.h:386
const void * config
Definition: device.h:384
Definition: kernel.h:2822
Macro utilities.