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