1d8ca7d18SDmitry Osipenko /* SPDX-License-Identifier: GPL-2.0 */
2d8ca7d18SDmitry Osipenko /*
3d8ca7d18SDmitry Osipenko  * coupler.h -- SoC Regulator support, coupler API.
4d8ca7d18SDmitry Osipenko  *
5d8ca7d18SDmitry Osipenko  * Regulator Coupler Interface.
6d8ca7d18SDmitry Osipenko  */
7d8ca7d18SDmitry Osipenko 
8d8ca7d18SDmitry Osipenko #ifndef __LINUX_REGULATOR_COUPLER_H_
9d8ca7d18SDmitry Osipenko #define __LINUX_REGULATOR_COUPLER_H_
10d8ca7d18SDmitry Osipenko 
11d8ca7d18SDmitry Osipenko #include <linux/kernel.h>
12d8ca7d18SDmitry Osipenko #include <linux/suspend.h>
13d8ca7d18SDmitry Osipenko 
14d8ca7d18SDmitry Osipenko struct regulator_coupler;
15d8ca7d18SDmitry Osipenko struct regulator_dev;
16d8ca7d18SDmitry Osipenko 
17d8ca7d18SDmitry Osipenko /**
18d8ca7d18SDmitry Osipenko  * struct regulator_coupler - customized regulator's coupler
19d8ca7d18SDmitry Osipenko  *
20d8ca7d18SDmitry Osipenko  * Regulator's coupler allows to customize coupling algorithm.
21d8ca7d18SDmitry Osipenko  *
22d8ca7d18SDmitry Osipenko  * @list: couplers list entry
23d8ca7d18SDmitry Osipenko  * @attach_regulator: Callback invoked on creation of a coupled regulator,
24d8ca7d18SDmitry Osipenko  *                    couples are unresolved at this point. The callee should
25d8ca7d18SDmitry Osipenko  *                    check that it could handle the regulator and return 0 on
26d8ca7d18SDmitry Osipenko  *                    success, -errno on failure and 1 if given regulator is
27d8ca7d18SDmitry Osipenko  *                    not suitable for this coupler (case of having multiple
28d8ca7d18SDmitry Osipenko  *                    regulators in a system). Callback shall be implemented.
29d8ca7d18SDmitry Osipenko  * @detach_regulator: Callback invoked on destruction of a coupled regulator.
30d8ca7d18SDmitry Osipenko  *                    This callback is optional and could be NULL.
31d8ca7d18SDmitry Osipenko  * @balance_voltage: Callback invoked when voltage of a coupled regulator is
32d8ca7d18SDmitry Osipenko  *                   changing. Called with all of the coupled rdev's being held
33d8ca7d18SDmitry Osipenko  *                   under "consumer lock". The callee should perform voltage
34d8ca7d18SDmitry Osipenko  *                   balancing, changing voltage of the coupled regulators as
35d8ca7d18SDmitry Osipenko  *                   needed. It's up to the coupler to verify the voltage
36d8ca7d18SDmitry Osipenko  *                   before changing it in hardware, i.e. coupler should
37d8ca7d18SDmitry Osipenko  *                   check consumer's min/max and etc. This callback is
38d8ca7d18SDmitry Osipenko  *                   optional and could be NULL, in which case a generic
39d8ca7d18SDmitry Osipenko  *                   voltage balancer will be used.
40d8ca7d18SDmitry Osipenko  */
41d8ca7d18SDmitry Osipenko struct regulator_coupler {
42d8ca7d18SDmitry Osipenko 	struct list_head list;
43d8ca7d18SDmitry Osipenko 
44d8ca7d18SDmitry Osipenko 	int (*attach_regulator)(struct regulator_coupler *coupler,
45d8ca7d18SDmitry Osipenko 				struct regulator_dev *rdev);
46d8ca7d18SDmitry Osipenko 	int (*detach_regulator)(struct regulator_coupler *coupler,
47d8ca7d18SDmitry Osipenko 				struct regulator_dev *rdev);
48d8ca7d18SDmitry Osipenko 	int (*balance_voltage)(struct regulator_coupler *coupler,
49d8ca7d18SDmitry Osipenko 			       struct regulator_dev *rdev,
50d8ca7d18SDmitry Osipenko 			       suspend_state_t state);
51d8ca7d18SDmitry Osipenko };
52d8ca7d18SDmitry Osipenko 
53d8ca7d18SDmitry Osipenko #ifdef CONFIG_REGULATOR
54d8ca7d18SDmitry Osipenko int regulator_coupler_register(struct regulator_coupler *coupler);
55d22b85a1SDmitry Osipenko int regulator_check_consumers(struct regulator_dev *rdev,
56d22b85a1SDmitry Osipenko 			      int *min_uV, int *max_uV,
57d22b85a1SDmitry Osipenko 			      suspend_state_t state);
58d22b85a1SDmitry Osipenko int regulator_check_voltage(struct regulator_dev *rdev,
59d22b85a1SDmitry Osipenko 			    int *min_uV, int *max_uV);
60d22b85a1SDmitry Osipenko int regulator_get_voltage_rdev(struct regulator_dev *rdev);
61d22b85a1SDmitry Osipenko int regulator_set_voltage_rdev(struct regulator_dev *rdev,
62d22b85a1SDmitry Osipenko 			       int min_uV, int max_uV,
63d22b85a1SDmitry Osipenko 			       suspend_state_t state);
64*752db83aSMarek Szyprowski int regulator_do_balance_voltage(struct regulator_dev *rdev,
65*752db83aSMarek Szyprowski 				 suspend_state_t state, bool skip_coupled);
66d8ca7d18SDmitry Osipenko #else
regulator_coupler_register(struct regulator_coupler * coupler)67d8ca7d18SDmitry Osipenko static inline int regulator_coupler_register(struct regulator_coupler *coupler)
68d8ca7d18SDmitry Osipenko {
69d8ca7d18SDmitry Osipenko 	return 0;
70d8ca7d18SDmitry Osipenko }
regulator_check_consumers(struct regulator_dev * rdev,int * min_uV,int * max_uV,suspend_state_t state)71d22b85a1SDmitry Osipenko static inline int regulator_check_consumers(struct regulator_dev *rdev,
72d22b85a1SDmitry Osipenko 					    int *min_uV, int *max_uV,
73d22b85a1SDmitry Osipenko 					    suspend_state_t state)
74d22b85a1SDmitry Osipenko {
75d22b85a1SDmitry Osipenko 	return -EINVAL;
76d22b85a1SDmitry Osipenko }
regulator_check_voltage(struct regulator_dev * rdev,int * min_uV,int * max_uV)77d22b85a1SDmitry Osipenko static inline int regulator_check_voltage(struct regulator_dev *rdev,
78d22b85a1SDmitry Osipenko 					  int *min_uV, int *max_uV)
79d22b85a1SDmitry Osipenko {
80d22b85a1SDmitry Osipenko 	return -EINVAL;
81d22b85a1SDmitry Osipenko }
regulator_get_voltage_rdev(struct regulator_dev * rdev)82d22b85a1SDmitry Osipenko static inline int regulator_get_voltage_rdev(struct regulator_dev *rdev)
83d22b85a1SDmitry Osipenko {
84d22b85a1SDmitry Osipenko 	return -EINVAL;
85d22b85a1SDmitry Osipenko }
regulator_set_voltage_rdev(struct regulator_dev * rdev,int min_uV,int max_uV,suspend_state_t state)86d22b85a1SDmitry Osipenko static inline int regulator_set_voltage_rdev(struct regulator_dev *rdev,
87d22b85a1SDmitry Osipenko 					     int min_uV, int max_uV,
88d22b85a1SDmitry Osipenko 					     suspend_state_t state)
89d22b85a1SDmitry Osipenko {
90d22b85a1SDmitry Osipenko 	return -EINVAL;
91d22b85a1SDmitry Osipenko }
regulator_do_balance_voltage(struct regulator_dev * rdev,suspend_state_t state,bool skip_coupled)92*752db83aSMarek Szyprowski static inline int regulator_do_balance_voltage(struct regulator_dev *rdev,
93*752db83aSMarek Szyprowski 					       suspend_state_t state,
94*752db83aSMarek Szyprowski 					       bool skip_coupled)
95*752db83aSMarek Szyprowski {
96*752db83aSMarek Szyprowski 	return -EINVAL;
97*752db83aSMarek Szyprowski }
98d8ca7d18SDmitry Osipenko #endif
99d8ca7d18SDmitry Osipenko 
100d8ca7d18SDmitry Osipenko #endif
101