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