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