blob: bf583e224b14539bdcd946680f906116928e1b4e [file] [log] [blame]
Pascal Paillet79503b82020-12-15 18:26:39 +01001/*
2 * Copyright (c) 2021, STMicroelectronics - All Rights Reserved
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#ifndef REGULATOR_H
7#define REGULATOR_H
8
9#include <platform_def.h>
10
11#ifndef PLAT_NB_RDEVS
12#error "Missing PLAT_NB_RDEVS"
13#endif
14
15/*
16 * Consumer interface
17 */
18
19/* regulator-always-on : regulator should never be disabled */
20#define REGUL_ALWAYS_ON BIT(0)
21/*
22 * regulator-boot-on:
23 * It's expected that this regulator was left on by the bootloader.
24 * The core shouldn't prevent it from being turned off later.
25 * The regulator is needed to exit from suspend so it is turned on during suspend entry.
26 */
27#define REGUL_BOOT_ON BIT(1)
28/* regulator-over-current-protection: Enable over current protection. */
29#define REGUL_OCP BIT(2)
30/* regulator-active-discharge: enable active discharge. */
31#define REGUL_ACTIVE_DISCHARGE BIT(3)
32/* regulator-pull-down: Enable pull down resistor when the regulator is disabled. */
33#define REGUL_PULL_DOWN BIT(4)
34/*
35 * st,mask-reset: set mask reset for the regulator, meaning that the regulator
36 * setting is maintained during pmic reset.
37 */
38#define REGUL_MASK_RESET BIT(5)
39/* st,regulator-sink-source: set the regulator in sink source mode */
40#define REGUL_SINK_SOURCE BIT(6)
41/* st,regulator-bypass: set the regulator in bypass mode */
42#define REGUL_ENABLE_BYPASS BIT(7)
43
44struct rdev *regulator_get_by_name(const char *node_name);
45
46struct rdev *regulator_get_by_supply_name(const void *fdt, int node, const char *name);
47
48int regulator_enable(struct rdev *rdev);
49int regulator_disable(struct rdev *rdev);
50int regulator_is_enabled(const struct rdev *rdev);
51
52int regulator_set_voltage(struct rdev *rdev, uint16_t volt);
53int regulator_set_min_voltage(struct rdev *rdev);
54int regulator_get_voltage(const struct rdev *rdev);
55
56int regulator_list_voltages(const struct rdev *rdev, const uint16_t **levels, size_t *count);
57void regulator_get_range(const struct rdev *rdev, uint16_t *min_mv, uint16_t *max_mv);
58int regulator_set_flag(struct rdev *rdev, uint16_t flag);
59
60/*
61 * Driver Interface
62 */
63
64/* set_state() arguments */
65#define STATE_DISABLE false
66#define STATE_ENABLE true
67
68struct regul_description {
69 const char *node_name;
70 const struct regul_ops *ops;
71 const void *driver_data;
72 const char *supply_name;
73 const uint32_t enable_ramp_delay;
74};
75
76struct regul_ops {
77 int (*set_state)(const struct regul_description *desc, bool state);
78 int (*get_state)(const struct regul_description *desc);
79 int (*set_voltage)(const struct regul_description *desc, uint16_t mv);
80 int (*get_voltage)(const struct regul_description *desc);
81 int (*list_voltages)(const struct regul_description *desc,
82 const uint16_t **levels, size_t *count);
83 int (*set_flag)(const struct regul_description *desc, uint16_t flag);
84 void (*lock)(const struct regul_description *desc);
85 void (*unlock)(const struct regul_description *desc);
86};
87
88int regulator_register(const struct regul_description *desc, int node);
89
90/*
91 * Internal regulator structure
92 * The structure is internal to the core, and the content should not be used
93 * by a consumer nor a driver.
94 */
95struct rdev {
96 const struct regul_description *desc;
97
98 int32_t phandle;
99
100 uint16_t min_mv;
101 uint16_t max_mv;
102
103 uint16_t flags;
104
105 uint32_t enable_ramp_delay;
106};
107
108#endif /* REGULATOR_H */