xref: /openbmc/linux/drivers/regulator/axp20x-regulator.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1dfe7a1b0SCarlo Caione /*
2dfe7a1b0SCarlo Caione  * AXP20x regulators driver.
3dfe7a1b0SCarlo Caione  *
4dfe7a1b0SCarlo Caione  * Copyright (C) 2013 Carlo Caione <carlo@caione.org>
5dfe7a1b0SCarlo Caione  *
6dfe7a1b0SCarlo Caione  * This file is subject to the terms and conditions of the GNU General
7dfe7a1b0SCarlo Caione  * Public License. See the file "COPYING" in the main directory of this
8dfe7a1b0SCarlo Caione  * archive for more details.
9dfe7a1b0SCarlo Caione  *
10dfe7a1b0SCarlo Caione  * This program is distributed in the hope that it will be useful,
11dfe7a1b0SCarlo Caione  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12dfe7a1b0SCarlo Caione  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13dfe7a1b0SCarlo Caione  * GNU General Public License for more details.
14dfe7a1b0SCarlo Caione  */
15dfe7a1b0SCarlo Caione 
16db4a555fSOlliver Schinagl #include <linux/bitops.h>
1777e3e3b1SOlliver Schinagl #include <linux/delay.h>
18dfe7a1b0SCarlo Caione #include <linux/err.h>
19dfe7a1b0SCarlo Caione #include <linux/init.h>
20db4a555fSOlliver Schinagl #include <linux/mfd/axp20x.h>
21dfe7a1b0SCarlo Caione #include <linux/module.h>
22dfe7a1b0SCarlo Caione #include <linux/of.h>
23dfe7a1b0SCarlo Caione #include <linux/platform_device.h>
24dfe7a1b0SCarlo Caione #include <linux/regmap.h>
25dfe7a1b0SCarlo Caione #include <linux/regulator/driver.h>
2677e3e3b1SOlliver Schinagl #include <linux/regulator/machine.h>
27dfe7a1b0SCarlo Caione #include <linux/regulator/of_regulator.h>
28dfe7a1b0SCarlo Caione 
29db4a555fSOlliver Schinagl #define AXP20X_GPIO0_FUNC_MASK		GENMASK(3, 0)
30db4a555fSOlliver Schinagl #define AXP20X_GPIO1_FUNC_MASK		GENMASK(3, 0)
31db4a555fSOlliver Schinagl 
32dfe7a1b0SCarlo Caione #define AXP20X_IO_ENABLED		0x03
33dfe7a1b0SCarlo Caione #define AXP20X_IO_DISABLED		0x07
34dfe7a1b0SCarlo Caione 
35db4a555fSOlliver Schinagl #define AXP20X_WORKMODE_DCDC2_MASK	BIT_MASK(2)
36db4a555fSOlliver Schinagl #define AXP20X_WORKMODE_DCDC3_MASK	BIT_MASK(1)
37db4a555fSOlliver Schinagl 
38db4a555fSOlliver Schinagl #define AXP20X_FREQ_DCDC_MASK		GENMASK(3, 0)
39db4a555fSOlliver Schinagl 
40db4a555fSOlliver Schinagl #define AXP20X_VBUS_IPSOUT_MGMT_MASK	BIT_MASK(2)
41db4a555fSOlliver Schinagl 
42db4a555fSOlliver Schinagl #define AXP20X_DCDC2_V_OUT_MASK		GENMASK(5, 0)
43db4a555fSOlliver Schinagl #define AXP20X_DCDC3_V_OUT_MASK		GENMASK(7, 0)
44fbb5a79dSIcenowy Zheng #define AXP20X_LDO2_V_OUT_MASK		GENMASK(7, 4)
45db4a555fSOlliver Schinagl #define AXP20X_LDO3_V_OUT_MASK		GENMASK(6, 0)
46fbb5a79dSIcenowy Zheng #define AXP20X_LDO4_V_OUT_MASK		GENMASK(3, 0)
47db4a555fSOlliver Schinagl #define AXP20X_LDO5_V_OUT_MASK		GENMASK(7, 4)
48db4a555fSOlliver Schinagl 
49db4a555fSOlliver Schinagl #define AXP20X_PWR_OUT_EXTEN_MASK	BIT_MASK(0)
50db4a555fSOlliver Schinagl #define AXP20X_PWR_OUT_DCDC3_MASK	BIT_MASK(1)
51db4a555fSOlliver Schinagl #define AXP20X_PWR_OUT_LDO2_MASK	BIT_MASK(2)
52db4a555fSOlliver Schinagl #define AXP20X_PWR_OUT_LDO4_MASK	BIT_MASK(3)
53db4a555fSOlliver Schinagl #define AXP20X_PWR_OUT_DCDC2_MASK	BIT_MASK(4)
54db4a555fSOlliver Schinagl #define AXP20X_PWR_OUT_LDO3_MASK	BIT_MASK(6)
55db4a555fSOlliver Schinagl 
56d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK	BIT_MASK(0)
57d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE(x) \
58d29f54dfSOlliver Schinagl 	((x) << 0)
59d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK		BIT_MASK(1)
60d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(x) \
61d29f54dfSOlliver Schinagl 	((x) << 1)
62d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK		BIT_MASK(2)
63d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN		BIT(2)
64d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK		BIT_MASK(3)
65d29f54dfSOlliver Schinagl #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN		BIT(3)
66d29f54dfSOlliver Schinagl 
67db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_1250mV_START	0x0
68db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_1250mV_STEPS	0
69db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_1250mV_END	\
70db4a555fSOlliver Schinagl 	(AXP20X_LDO4_V_OUT_1250mV_START + AXP20X_LDO4_V_OUT_1250mV_STEPS)
71db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_1300mV_START	0x1
72db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_1300mV_STEPS	7
73db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_1300mV_END	\
74db4a555fSOlliver Schinagl 	(AXP20X_LDO4_V_OUT_1300mV_START + AXP20X_LDO4_V_OUT_1300mV_STEPS)
75db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_2500mV_START	0x9
76db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_2500mV_STEPS	0
77db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_2500mV_END	\
78db4a555fSOlliver Schinagl 	(AXP20X_LDO4_V_OUT_2500mV_START + AXP20X_LDO4_V_OUT_2500mV_STEPS)
79db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_2700mV_START	0xa
80db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_2700mV_STEPS	1
81db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_2700mV_END	\
82db4a555fSOlliver Schinagl 	(AXP20X_LDO4_V_OUT_2700mV_START + AXP20X_LDO4_V_OUT_2700mV_STEPS)
83db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_3000mV_START	0xc
84db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_3000mV_STEPS	3
85db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_3000mV_END	\
86db4a555fSOlliver Schinagl 	(AXP20X_LDO4_V_OUT_3000mV_START + AXP20X_LDO4_V_OUT_3000mV_STEPS)
87db4a555fSOlliver Schinagl #define AXP20X_LDO4_V_OUT_NUM_VOLTAGES	16
88db4a555fSOlliver Schinagl 
893cb99e2eSChen-Yu Tsai #define AXP22X_IO_ENABLED		0x03
903cb99e2eSChen-Yu Tsai #define AXP22X_IO_DISABLED		0x04
911b82b4e4SBoris BREZILLON 
92db4a555fSOlliver Schinagl #define AXP22X_WORKMODE_DCDCX_MASK(x)	BIT_MASK(x)
93dfe7a1b0SCarlo Caione 
94636e2a39SHans de Goede #define AXP22X_MISC_N_VBUSEN_FUNC	BIT(4)
95636e2a39SHans de Goede 
96db4a555fSOlliver Schinagl #define AXP22X_DCDC1_V_OUT_MASK		GENMASK(4, 0)
97db4a555fSOlliver Schinagl #define AXP22X_DCDC2_V_OUT_MASK		GENMASK(5, 0)
98db4a555fSOlliver Schinagl #define AXP22X_DCDC3_V_OUT_MASK		GENMASK(5, 0)
99db4a555fSOlliver Schinagl #define AXP22X_DCDC4_V_OUT_MASK		GENMASK(5, 0)
100db4a555fSOlliver Schinagl #define AXP22X_DCDC5_V_OUT_MASK		GENMASK(4, 0)
101db4a555fSOlliver Schinagl #define AXP22X_DC5LDO_V_OUT_MASK	GENMASK(2, 0)
102db4a555fSOlliver Schinagl #define AXP22X_ALDO1_V_OUT_MASK		GENMASK(4, 0)
103db4a555fSOlliver Schinagl #define AXP22X_ALDO2_V_OUT_MASK		GENMASK(4, 0)
104db4a555fSOlliver Schinagl #define AXP22X_ALDO3_V_OUT_MASK		GENMASK(4, 0)
105db4a555fSOlliver Schinagl #define AXP22X_DLDO1_V_OUT_MASK		GENMASK(4, 0)
106db4a555fSOlliver Schinagl #define AXP22X_DLDO2_V_OUT_MASK		GENMASK(4, 0)
107db4a555fSOlliver Schinagl #define AXP22X_DLDO3_V_OUT_MASK		GENMASK(4, 0)
108db4a555fSOlliver Schinagl #define AXP22X_DLDO4_V_OUT_MASK		GENMASK(4, 0)
109db4a555fSOlliver Schinagl #define AXP22X_ELDO1_V_OUT_MASK		GENMASK(4, 0)
110db4a555fSOlliver Schinagl #define AXP22X_ELDO2_V_OUT_MASK		GENMASK(4, 0)
111db4a555fSOlliver Schinagl #define AXP22X_ELDO3_V_OUT_MASK		GENMASK(4, 0)
112db4a555fSOlliver Schinagl #define AXP22X_LDO_IO0_V_OUT_MASK	GENMASK(4, 0)
113db4a555fSOlliver Schinagl #define AXP22X_LDO_IO1_V_OUT_MASK	GENMASK(4, 0)
114db4a555fSOlliver Schinagl 
115db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DC5LDO_MASK	BIT_MASK(0)
116db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DCDC1_MASK	BIT_MASK(1)
117db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DCDC2_MASK	BIT_MASK(2)
118db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DCDC3_MASK	BIT_MASK(3)
119db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DCDC4_MASK	BIT_MASK(4)
120db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DCDC5_MASK	BIT_MASK(5)
121db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_ALDO1_MASK	BIT_MASK(6)
122db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_ALDO2_MASK	BIT_MASK(7)
123db4a555fSOlliver Schinagl 
124db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_SW_MASK		BIT_MASK(6)
125db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DC1SW_MASK	BIT_MASK(7)
126db4a555fSOlliver Schinagl 
127db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_ELDO1_MASK	BIT_MASK(0)
128db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_ELDO2_MASK	BIT_MASK(1)
129db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_ELDO3_MASK	BIT_MASK(2)
130db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DLDO1_MASK	BIT_MASK(3)
131db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DLDO2_MASK	BIT_MASK(4)
132db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DLDO3_MASK	BIT_MASK(5)
133db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_DLDO4_MASK	BIT_MASK(6)
134db4a555fSOlliver Schinagl #define AXP22X_PWR_OUT_ALDO3_MASK	BIT_MASK(7)
135db4a555fSOlliver Schinagl 
13660fd7eb8SMartin Botka #define AXP313A_DCDC1_NUM_VOLTAGES	107
13760fd7eb8SMartin Botka #define AXP313A_DCDC23_NUM_VOLTAGES	88
13860fd7eb8SMartin Botka #define AXP313A_DCDC_V_OUT_MASK		GENMASK(6, 0)
13960fd7eb8SMartin Botka #define AXP313A_LDO_V_OUT_MASK		GENMASK(4, 0)
14060fd7eb8SMartin Botka 
141db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_DCDC1_MASK	BIT_MASK(0)
142db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_DCDC2_MASK	BIT_MASK(1)
143db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_DCDC3_MASK	BIT_MASK(2)
144db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_DCDC4_MASK	BIT_MASK(3)
145db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_DCDC5_MASK	BIT_MASK(4)
146db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_DCDC6_MASK	BIT_MASK(5)
147db4a555fSOlliver Schinagl 
148db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_FLDO1_MASK	BIT_MASK(2)
149db4a555fSOlliver Schinagl #define AXP803_PWR_OUT_FLDO2_MASK	BIT_MASK(3)
150db4a555fSOlliver Schinagl 
151db4a555fSOlliver Schinagl #define AXP803_DCDC1_V_OUT_MASK		GENMASK(4, 0)
152db4a555fSOlliver Schinagl #define AXP803_DCDC2_V_OUT_MASK		GENMASK(6, 0)
153db4a555fSOlliver Schinagl #define AXP803_DCDC3_V_OUT_MASK		GENMASK(6, 0)
154db4a555fSOlliver Schinagl #define AXP803_DCDC4_V_OUT_MASK		GENMASK(6, 0)
155db4a555fSOlliver Schinagl #define AXP803_DCDC5_V_OUT_MASK		GENMASK(6, 0)
156db4a555fSOlliver Schinagl #define AXP803_DCDC6_V_OUT_MASK		GENMASK(6, 0)
157db4a555fSOlliver Schinagl 
158db4a555fSOlliver Schinagl #define AXP803_FLDO1_V_OUT_MASK		GENMASK(3, 0)
159db4a555fSOlliver Schinagl #define AXP803_FLDO2_V_OUT_MASK		GENMASK(3, 0)
160db4a555fSOlliver Schinagl 
161db4a555fSOlliver Schinagl #define AXP803_DCDC23_POLYPHASE_DUAL	BIT(6)
162db4a555fSOlliver Schinagl #define AXP803_DCDC56_POLYPHASE_DUAL	BIT(5)
163db4a555fSOlliver Schinagl 
164db4a555fSOlliver Schinagl #define AXP803_DCDC234_500mV_START	0x00
165db4a555fSOlliver Schinagl #define AXP803_DCDC234_500mV_STEPS	70
166db4a555fSOlliver Schinagl #define AXP803_DCDC234_500mV_END	\
167db4a555fSOlliver Schinagl 	(AXP803_DCDC234_500mV_START + AXP803_DCDC234_500mV_STEPS)
168db4a555fSOlliver Schinagl #define AXP803_DCDC234_1220mV_START	0x47
169db4a555fSOlliver Schinagl #define AXP803_DCDC234_1220mV_STEPS	4
170db4a555fSOlliver Schinagl #define AXP803_DCDC234_1220mV_END	\
171db4a555fSOlliver Schinagl 	(AXP803_DCDC234_1220mV_START + AXP803_DCDC234_1220mV_STEPS)
172db4a555fSOlliver Schinagl #define AXP803_DCDC234_NUM_VOLTAGES	76
173db4a555fSOlliver Schinagl 
174db4a555fSOlliver Schinagl #define AXP803_DCDC5_800mV_START	0x00
175db4a555fSOlliver Schinagl #define AXP803_DCDC5_800mV_STEPS	32
176db4a555fSOlliver Schinagl #define AXP803_DCDC5_800mV_END		\
177db4a555fSOlliver Schinagl 	(AXP803_DCDC5_800mV_START + AXP803_DCDC5_800mV_STEPS)
178db4a555fSOlliver Schinagl #define AXP803_DCDC5_1140mV_START	0x21
179db4a555fSOlliver Schinagl #define AXP803_DCDC5_1140mV_STEPS	35
180db4a555fSOlliver Schinagl #define AXP803_DCDC5_1140mV_END		\
181db4a555fSOlliver Schinagl 	(AXP803_DCDC5_1140mV_START + AXP803_DCDC5_1140mV_STEPS)
1828f46e22bSJernej Skrabec #define AXP803_DCDC5_NUM_VOLTAGES	69
183db4a555fSOlliver Schinagl 
184db4a555fSOlliver Schinagl #define AXP803_DCDC6_600mV_START	0x00
185db4a555fSOlliver Schinagl #define AXP803_DCDC6_600mV_STEPS	50
186db4a555fSOlliver Schinagl #define AXP803_DCDC6_600mV_END		\
187db4a555fSOlliver Schinagl 	(AXP803_DCDC6_600mV_START + AXP803_DCDC6_600mV_STEPS)
188db4a555fSOlliver Schinagl #define AXP803_DCDC6_1120mV_START	0x33
1898f46e22bSJernej Skrabec #define AXP803_DCDC6_1120mV_STEPS	20
190db4a555fSOlliver Schinagl #define AXP803_DCDC6_1120mV_END		\
191db4a555fSOlliver Schinagl 	(AXP803_DCDC6_1120mV_START + AXP803_DCDC6_1120mV_STEPS)
192db4a555fSOlliver Schinagl #define AXP803_DCDC6_NUM_VOLTAGES	72
193db4a555fSOlliver Schinagl 
194db4a555fSOlliver Schinagl #define AXP803_DLDO2_700mV_START	0x00
195db4a555fSOlliver Schinagl #define AXP803_DLDO2_700mV_STEPS	26
196db4a555fSOlliver Schinagl #define AXP803_DLDO2_700mV_END		\
197db4a555fSOlliver Schinagl 	(AXP803_DLDO2_700mV_START + AXP803_DLDO2_700mV_STEPS)
198db4a555fSOlliver Schinagl #define AXP803_DLDO2_3400mV_START	0x1b
199db4a555fSOlliver Schinagl #define AXP803_DLDO2_3400mV_STEPS	4
200db4a555fSOlliver Schinagl #define AXP803_DLDO2_3400mV_END		\
201db4a555fSOlliver Schinagl 	(AXP803_DLDO2_3400mV_START + AXP803_DLDO2_3400mV_STEPS)
202db4a555fSOlliver Schinagl #define AXP803_DLDO2_NUM_VOLTAGES	32
203db4a555fSOlliver Schinagl 
204db4a555fSOlliver Schinagl #define AXP806_DCDCA_V_CTRL_MASK	GENMASK(6, 0)
205db4a555fSOlliver Schinagl #define AXP806_DCDCB_V_CTRL_MASK	GENMASK(4, 0)
206db4a555fSOlliver Schinagl #define AXP806_DCDCC_V_CTRL_MASK	GENMASK(6, 0)
207db4a555fSOlliver Schinagl #define AXP806_DCDCD_V_CTRL_MASK	GENMASK(5, 0)
208db4a555fSOlliver Schinagl #define AXP806_DCDCE_V_CTRL_MASK	GENMASK(4, 0)
209db4a555fSOlliver Schinagl #define AXP806_ALDO1_V_CTRL_MASK	GENMASK(4, 0)
210db4a555fSOlliver Schinagl #define AXP806_ALDO2_V_CTRL_MASK	GENMASK(4, 0)
211db4a555fSOlliver Schinagl #define AXP806_ALDO3_V_CTRL_MASK	GENMASK(4, 0)
212db4a555fSOlliver Schinagl #define AXP806_BLDO1_V_CTRL_MASK	GENMASK(3, 0)
213db4a555fSOlliver Schinagl #define AXP806_BLDO2_V_CTRL_MASK	GENMASK(3, 0)
214db4a555fSOlliver Schinagl #define AXP806_BLDO3_V_CTRL_MASK	GENMASK(3, 0)
215db4a555fSOlliver Schinagl #define AXP806_BLDO4_V_CTRL_MASK	GENMASK(3, 0)
216db4a555fSOlliver Schinagl #define AXP806_CLDO1_V_CTRL_MASK	GENMASK(4, 0)
217db4a555fSOlliver Schinagl #define AXP806_CLDO2_V_CTRL_MASK	GENMASK(4, 0)
218db4a555fSOlliver Schinagl #define AXP806_CLDO3_V_CTRL_MASK	GENMASK(4, 0)
219db4a555fSOlliver Schinagl 
220db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_DCDCA_MASK	BIT_MASK(0)
221db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_DCDCB_MASK	BIT_MASK(1)
222db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_DCDCC_MASK	BIT_MASK(2)
223db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_DCDCD_MASK	BIT_MASK(3)
224db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_DCDCE_MASK	BIT_MASK(4)
225db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_ALDO1_MASK	BIT_MASK(5)
226db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_ALDO2_MASK	BIT_MASK(6)
227db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_ALDO3_MASK	BIT_MASK(7)
228db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_BLDO1_MASK	BIT_MASK(0)
229db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_BLDO2_MASK	BIT_MASK(1)
230db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_BLDO3_MASK	BIT_MASK(2)
231db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_BLDO4_MASK	BIT_MASK(3)
232db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_CLDO1_MASK	BIT_MASK(4)
233db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_CLDO2_MASK	BIT_MASK(5)
234db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_CLDO3_MASK	BIT_MASK(6)
235db4a555fSOlliver Schinagl #define AXP806_PWR_OUT_SW_MASK		BIT_MASK(7)
236db4a555fSOlliver Schinagl 
237db4a555fSOlliver Schinagl #define AXP806_DCDCAB_POLYPHASE_DUAL	0x40
238db4a555fSOlliver Schinagl #define AXP806_DCDCABC_POLYPHASE_TRI	0x80
239db4a555fSOlliver Schinagl #define AXP806_DCDCABC_POLYPHASE_MASK	GENMASK(7, 6)
240db4a555fSOlliver Schinagl 
241db4a555fSOlliver Schinagl #define AXP806_DCDCDE_POLYPHASE_DUAL	BIT(5)
242db4a555fSOlliver Schinagl 
243db4a555fSOlliver Schinagl #define AXP806_DCDCA_600mV_START	0x00
244db4a555fSOlliver Schinagl #define AXP806_DCDCA_600mV_STEPS	50
245db4a555fSOlliver Schinagl #define AXP806_DCDCA_600mV_END		\
246db4a555fSOlliver Schinagl 	(AXP806_DCDCA_600mV_START + AXP806_DCDCA_600mV_STEPS)
247db4a555fSOlliver Schinagl #define AXP806_DCDCA_1120mV_START	0x33
2481ef55fedSJernej Skrabec #define AXP806_DCDCA_1120mV_STEPS	20
249db4a555fSOlliver Schinagl #define AXP806_DCDCA_1120mV_END		\
250db4a555fSOlliver Schinagl 	(AXP806_DCDCA_1120mV_START + AXP806_DCDCA_1120mV_STEPS)
251db4a555fSOlliver Schinagl #define AXP806_DCDCA_NUM_VOLTAGES	72
252db4a555fSOlliver Schinagl 
253db4a555fSOlliver Schinagl #define AXP806_DCDCD_600mV_START	0x00
254db4a555fSOlliver Schinagl #define AXP806_DCDCD_600mV_STEPS	45
255db4a555fSOlliver Schinagl #define AXP806_DCDCD_600mV_END		\
256db4a555fSOlliver Schinagl 	(AXP806_DCDCD_600mV_START + AXP806_DCDCD_600mV_STEPS)
257db4a555fSOlliver Schinagl #define AXP806_DCDCD_1600mV_START	0x2e
258db4a555fSOlliver Schinagl #define AXP806_DCDCD_1600mV_STEPS	17
259db4a555fSOlliver Schinagl #define AXP806_DCDCD_1600mV_END		\
260db4a555fSOlliver Schinagl 	(AXP806_DCDCD_1600mV_START + AXP806_DCDCD_1600mV_STEPS)
261db4a555fSOlliver Schinagl #define AXP806_DCDCD_NUM_VOLTAGES	64
262db4a555fSOlliver Schinagl 
263db4a555fSOlliver Schinagl #define AXP809_DCDC4_600mV_START	0x00
264db4a555fSOlliver Schinagl #define AXP809_DCDC4_600mV_STEPS	47
265db4a555fSOlliver Schinagl #define AXP809_DCDC4_600mV_END		\
266db4a555fSOlliver Schinagl 	(AXP809_DCDC4_600mV_START + AXP809_DCDC4_600mV_STEPS)
267db4a555fSOlliver Schinagl #define AXP809_DCDC4_1800mV_START	0x30
268db4a555fSOlliver Schinagl #define AXP809_DCDC4_1800mV_STEPS	8
269db4a555fSOlliver Schinagl #define AXP809_DCDC4_1800mV_END		\
270db4a555fSOlliver Schinagl 	(AXP809_DCDC4_1800mV_START + AXP809_DCDC4_1800mV_STEPS)
271db4a555fSOlliver Schinagl #define AXP809_DCDC4_NUM_VOLTAGES	57
272db4a555fSOlliver Schinagl 
273db4a555fSOlliver Schinagl #define AXP813_DCDC7_V_OUT_MASK		GENMASK(6, 0)
274db4a555fSOlliver Schinagl 
275db4a555fSOlliver Schinagl #define AXP813_PWR_OUT_DCDC7_MASK	BIT_MASK(6)
276db4a555fSOlliver Schinagl 
277*9e72869dSShengyu Qu #define AXP15060_DCDC1_V_CTRL_MASK		GENMASK(4, 0)
278*9e72869dSShengyu Qu #define AXP15060_DCDC2_V_CTRL_MASK		GENMASK(6, 0)
279*9e72869dSShengyu Qu #define AXP15060_DCDC3_V_CTRL_MASK		GENMASK(6, 0)
280*9e72869dSShengyu Qu #define AXP15060_DCDC4_V_CTRL_MASK		GENMASK(6, 0)
281*9e72869dSShengyu Qu #define AXP15060_DCDC5_V_CTRL_MASK		GENMASK(6, 0)
282*9e72869dSShengyu Qu #define AXP15060_DCDC6_V_CTRL_MASK		GENMASK(4, 0)
283*9e72869dSShengyu Qu #define AXP15060_ALDO1_V_CTRL_MASK		GENMASK(4, 0)
284*9e72869dSShengyu Qu #define AXP15060_ALDO2_V_CTRL_MASK		GENMASK(4, 0)
285*9e72869dSShengyu Qu #define AXP15060_ALDO3_V_CTRL_MASK		GENMASK(4, 0)
286*9e72869dSShengyu Qu #define AXP15060_ALDO4_V_CTRL_MASK		GENMASK(4, 0)
287*9e72869dSShengyu Qu #define AXP15060_ALDO5_V_CTRL_MASK		GENMASK(4, 0)
288*9e72869dSShengyu Qu #define AXP15060_BLDO1_V_CTRL_MASK		GENMASK(4, 0)
289*9e72869dSShengyu Qu #define AXP15060_BLDO2_V_CTRL_MASK		GENMASK(4, 0)
290*9e72869dSShengyu Qu #define AXP15060_BLDO3_V_CTRL_MASK		GENMASK(4, 0)
291*9e72869dSShengyu Qu #define AXP15060_BLDO4_V_CTRL_MASK		GENMASK(4, 0)
292*9e72869dSShengyu Qu #define AXP15060_BLDO5_V_CTRL_MASK		GENMASK(4, 0)
293*9e72869dSShengyu Qu #define AXP15060_CLDO1_V_CTRL_MASK		GENMASK(4, 0)
294*9e72869dSShengyu Qu #define AXP15060_CLDO2_V_CTRL_MASK		GENMASK(4, 0)
295*9e72869dSShengyu Qu #define AXP15060_CLDO3_V_CTRL_MASK		GENMASK(4, 0)
296*9e72869dSShengyu Qu #define AXP15060_CLDO4_V_CTRL_MASK		GENMASK(5, 0)
297*9e72869dSShengyu Qu #define AXP15060_CPUSLDO_V_CTRL_MASK		GENMASK(3, 0)
298*9e72869dSShengyu Qu 
299*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_DCDC1_MASK	BIT_MASK(0)
300*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_DCDC2_MASK	BIT_MASK(1)
301*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_DCDC3_MASK	BIT_MASK(2)
302*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_DCDC4_MASK	BIT_MASK(3)
303*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_DCDC5_MASK	BIT_MASK(4)
304*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_DCDC6_MASK	BIT_MASK(5)
305*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_ALDO1_MASK	BIT_MASK(0)
306*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_ALDO2_MASK	BIT_MASK(1)
307*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_ALDO3_MASK	BIT_MASK(2)
308*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_ALDO4_MASK	BIT_MASK(3)
309*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_ALDO5_MASK	BIT_MASK(4)
310*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_BLDO1_MASK	BIT_MASK(5)
311*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_BLDO2_MASK	BIT_MASK(6)
312*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_BLDO3_MASK	BIT_MASK(7)
313*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_BLDO4_MASK	BIT_MASK(0)
314*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_BLDO5_MASK	BIT_MASK(1)
315*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_CLDO1_MASK	BIT_MASK(2)
316*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_CLDO2_MASK	BIT_MASK(3)
317*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_CLDO3_MASK	BIT_MASK(4)
318*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_CLDO4_MASK	BIT_MASK(5)
319*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_CPUSLDO_MASK	BIT_MASK(6)
320*9e72869dSShengyu Qu #define AXP15060_PWR_OUT_SW_MASK		BIT_MASK(7)
321*9e72869dSShengyu Qu 
322*9e72869dSShengyu Qu #define AXP15060_DCDC23_POLYPHASE_DUAL_MASK		BIT_MASK(6)
323*9e72869dSShengyu Qu #define AXP15060_DCDC46_POLYPHASE_DUAL_MASK		BIT_MASK(7)
324*9e72869dSShengyu Qu 
325*9e72869dSShengyu Qu #define AXP15060_DCDC234_500mV_START	0x00
326*9e72869dSShengyu Qu #define AXP15060_DCDC234_500mV_STEPS	70
327*9e72869dSShengyu Qu #define AXP15060_DCDC234_500mV_END		\
328*9e72869dSShengyu Qu 	(AXP15060_DCDC234_500mV_START + AXP15060_DCDC234_500mV_STEPS)
329*9e72869dSShengyu Qu #define AXP15060_DCDC234_1220mV_START	0x47
330*9e72869dSShengyu Qu #define AXP15060_DCDC234_1220mV_STEPS	16
331*9e72869dSShengyu Qu #define AXP15060_DCDC234_1220mV_END		\
332*9e72869dSShengyu Qu 	(AXP15060_DCDC234_1220mV_START + AXP15060_DCDC234_1220mV_STEPS)
333*9e72869dSShengyu Qu #define AXP15060_DCDC234_NUM_VOLTAGES	88
334*9e72869dSShengyu Qu 
335*9e72869dSShengyu Qu #define AXP15060_DCDC5_800mV_START	0x00
336*9e72869dSShengyu Qu #define AXP15060_DCDC5_800mV_STEPS	32
337*9e72869dSShengyu Qu #define AXP15060_DCDC5_800mV_END		\
338*9e72869dSShengyu Qu 	(AXP15060_DCDC5_800mV_START + AXP15060_DCDC5_800mV_STEPS)
339*9e72869dSShengyu Qu #define AXP15060_DCDC5_1140mV_START	0x21
340*9e72869dSShengyu Qu #define AXP15060_DCDC5_1140mV_STEPS	35
341*9e72869dSShengyu Qu #define AXP15060_DCDC5_1140mV_END		\
342*9e72869dSShengyu Qu 	(AXP15060_DCDC5_1140mV_START + AXP15060_DCDC5_1140mV_STEPS)
343*9e72869dSShengyu Qu #define AXP15060_DCDC5_NUM_VOLTAGES	69
344*9e72869dSShengyu Qu 
345866bd951SBoris BREZILLON #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\
346866bd951SBoris BREZILLON 		    _vmask, _ereg, _emask, _enable_val, _disable_val)		\
347866bd951SBoris BREZILLON 	[_family##_##_id] = {							\
348e0bbb38cSChen-Yu Tsai 		.name		= (_match),					\
349dfe7a1b0SCarlo Caione 		.supply_name	= (_supply),					\
350880fe82dSChen-Yu Tsai 		.of_match	= of_match_ptr(_match),				\
351880fe82dSChen-Yu Tsai 		.regulators_node = of_match_ptr("regulators"),			\
352dfe7a1b0SCarlo Caione 		.type		= REGULATOR_VOLTAGE,				\
353866bd951SBoris BREZILLON 		.id		= _family##_##_id,				\
354dfe7a1b0SCarlo Caione 		.n_voltages	= (((_max) - (_min)) / (_step) + 1),		\
355dfe7a1b0SCarlo Caione 		.owner		= THIS_MODULE,					\
356dfe7a1b0SCarlo Caione 		.min_uV		= (_min) * 1000,				\
357dfe7a1b0SCarlo Caione 		.uV_step	= (_step) * 1000,				\
358dfe7a1b0SCarlo Caione 		.vsel_reg	= (_vreg),					\
359dfe7a1b0SCarlo Caione 		.vsel_mask	= (_vmask),					\
360dfe7a1b0SCarlo Caione 		.enable_reg	= (_ereg),					\
361dfe7a1b0SCarlo Caione 		.enable_mask	= (_emask),					\
362dfe7a1b0SCarlo Caione 		.enable_val	= (_enable_val),				\
363dfe7a1b0SCarlo Caione 		.disable_val	= (_disable_val),				\
364dfe7a1b0SCarlo Caione 		.ops		= &axp20x_ops,					\
365dfe7a1b0SCarlo Caione 	}
366dfe7a1b0SCarlo Caione 
367866bd951SBoris BREZILLON #define AXP_DESC(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\
368866bd951SBoris BREZILLON 		 _vmask, _ereg, _emask) 					\
369866bd951SBoris BREZILLON 	[_family##_##_id] = {							\
370e0bbb38cSChen-Yu Tsai 		.name		= (_match),					\
371dfe7a1b0SCarlo Caione 		.supply_name	= (_supply),					\
372880fe82dSChen-Yu Tsai 		.of_match	= of_match_ptr(_match),				\
373880fe82dSChen-Yu Tsai 		.regulators_node = of_match_ptr("regulators"),			\
374dfe7a1b0SCarlo Caione 		.type		= REGULATOR_VOLTAGE,				\
375866bd951SBoris BREZILLON 		.id		= _family##_##_id,				\
376dfe7a1b0SCarlo Caione 		.n_voltages	= (((_max) - (_min)) / (_step) + 1),		\
377dfe7a1b0SCarlo Caione 		.owner		= THIS_MODULE,					\
378dfe7a1b0SCarlo Caione 		.min_uV		= (_min) * 1000,				\
379dfe7a1b0SCarlo Caione 		.uV_step	= (_step) * 1000,				\
380dfe7a1b0SCarlo Caione 		.vsel_reg	= (_vreg),					\
381dfe7a1b0SCarlo Caione 		.vsel_mask	= (_vmask),					\
382dfe7a1b0SCarlo Caione 		.enable_reg	= (_ereg),					\
383dfe7a1b0SCarlo Caione 		.enable_mask	= (_emask),					\
384dfe7a1b0SCarlo Caione 		.ops		= &axp20x_ops,					\
385dfe7a1b0SCarlo Caione 	}
386dfe7a1b0SCarlo Caione 
38794c39041SChen-Yu Tsai #define AXP_DESC_SW(_family, _id, _match, _supply, _ereg, _emask)		\
3881b82b4e4SBoris BREZILLON 	[_family##_##_id] = {							\
389e0bbb38cSChen-Yu Tsai 		.name		= (_match),					\
3901b82b4e4SBoris BREZILLON 		.supply_name	= (_supply),					\
3911b82b4e4SBoris BREZILLON 		.of_match	= of_match_ptr(_match),				\
3921b82b4e4SBoris BREZILLON 		.regulators_node = of_match_ptr("regulators"),			\
3931b82b4e4SBoris BREZILLON 		.type		= REGULATOR_VOLTAGE,				\
3941b82b4e4SBoris BREZILLON 		.id		= _family##_##_id,				\
3951b82b4e4SBoris BREZILLON 		.owner		= THIS_MODULE,					\
3961b82b4e4SBoris BREZILLON 		.enable_reg	= (_ereg),					\
3971b82b4e4SBoris BREZILLON 		.enable_mask	= (_emask),					\
3981b82b4e4SBoris BREZILLON 		.ops		= &axp20x_ops_sw,				\
3991b82b4e4SBoris BREZILLON 	}
4001b82b4e4SBoris BREZILLON 
401866bd951SBoris BREZILLON #define AXP_DESC_FIXED(_family, _id, _match, _supply, _volt)			\
402866bd951SBoris BREZILLON 	[_family##_##_id] = {							\
403e0bbb38cSChen-Yu Tsai 		.name		= (_match),					\
404dfe7a1b0SCarlo Caione 		.supply_name	= (_supply),					\
405880fe82dSChen-Yu Tsai 		.of_match	= of_match_ptr(_match),				\
406880fe82dSChen-Yu Tsai 		.regulators_node = of_match_ptr("regulators"),			\
407dfe7a1b0SCarlo Caione 		.type		= REGULATOR_VOLTAGE,				\
408866bd951SBoris BREZILLON 		.id		= _family##_##_id,				\
409dfe7a1b0SCarlo Caione 		.n_voltages	= 1,						\
410dfe7a1b0SCarlo Caione 		.owner		= THIS_MODULE,					\
411dfe7a1b0SCarlo Caione 		.min_uV		= (_volt) * 1000,				\
412dfe7a1b0SCarlo Caione 		.ops		= &axp20x_ops_fixed				\
413dfe7a1b0SCarlo Caione 	}
414dfe7a1b0SCarlo Caione 
41513d57e64SChen-Yu Tsai #define AXP_DESC_RANGES(_family, _id, _match, _supply, _ranges, _n_voltages,	\
41613d57e64SChen-Yu Tsai 			_vreg, _vmask, _ereg, _emask)				\
417866bd951SBoris BREZILLON 	[_family##_##_id] = {							\
418e0bbb38cSChen-Yu Tsai 		.name		= (_match),					\
419dfe7a1b0SCarlo Caione 		.supply_name	= (_supply),					\
420880fe82dSChen-Yu Tsai 		.of_match	= of_match_ptr(_match),				\
421880fe82dSChen-Yu Tsai 		.regulators_node = of_match_ptr("regulators"),			\
422dfe7a1b0SCarlo Caione 		.type		= REGULATOR_VOLTAGE,				\
423866bd951SBoris BREZILLON 		.id		= _family##_##_id,				\
42413d57e64SChen-Yu Tsai 		.n_voltages	= (_n_voltages),				\
425dfe7a1b0SCarlo Caione 		.owner		= THIS_MODULE,					\
426dfe7a1b0SCarlo Caione 		.vsel_reg	= (_vreg),					\
427dfe7a1b0SCarlo Caione 		.vsel_mask	= (_vmask),					\
428dfe7a1b0SCarlo Caione 		.enable_reg	= (_ereg),					\
429dfe7a1b0SCarlo Caione 		.enable_mask	= (_emask),					\
43013d57e64SChen-Yu Tsai 		.linear_ranges	= (_ranges),					\
43113d57e64SChen-Yu Tsai 		.n_linear_ranges = ARRAY_SIZE(_ranges),				\
43213d57e64SChen-Yu Tsai 		.ops		= &axp20x_ops_range,				\
433dfe7a1b0SCarlo Caione 	}
434dfe7a1b0SCarlo Caione 
435d29f54dfSOlliver Schinagl static const int axp209_dcdc2_ldo3_slew_rates[] = {
436d29f54dfSOlliver Schinagl 	1600,
437d29f54dfSOlliver Schinagl 	 800,
438d29f54dfSOlliver Schinagl };
439d29f54dfSOlliver Schinagl 
axp20x_set_ramp_delay(struct regulator_dev * rdev,int ramp)440d29f54dfSOlliver Schinagl static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp)
441d29f54dfSOlliver Schinagl {
442d29f54dfSOlliver Schinagl 	struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
44304d1446bSAxel Lin 	int id = rdev_get_id(rdev);
444d29f54dfSOlliver Schinagl 	u8 reg, mask, enable, cfg = 0xff;
445d29f54dfSOlliver Schinagl 	const int *slew_rates;
446d29f54dfSOlliver Schinagl 	int rate_count = 0;
447d29f54dfSOlliver Schinagl 
448d29f54dfSOlliver Schinagl 	switch (axp20x->variant) {
449d29f54dfSOlliver Schinagl 	case AXP209_ID:
45004d1446bSAxel Lin 		if (id == AXP20X_DCDC2) {
451918446c9SPriit Laes 			slew_rates = axp209_dcdc2_ldo3_slew_rates;
452d29f54dfSOlliver Schinagl 			rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates);
453d29f54dfSOlliver Schinagl 			reg = AXP20X_DCDC2_LDO3_V_RAMP;
454d29f54dfSOlliver Schinagl 			mask = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK |
455d29f54dfSOlliver Schinagl 			       AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK;
456d29f54dfSOlliver Schinagl 			enable = (ramp > 0) ?
457a0fc8b6aSOndrej Jirman 				 AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN : 0;
458d29f54dfSOlliver Schinagl 			break;
459d29f54dfSOlliver Schinagl 		}
460d29f54dfSOlliver Schinagl 
46104d1446bSAxel Lin 		if (id == AXP20X_LDO3) {
462d29f54dfSOlliver Schinagl 			slew_rates = axp209_dcdc2_ldo3_slew_rates;
463d29f54dfSOlliver Schinagl 			rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates);
464d29f54dfSOlliver Schinagl 			reg = AXP20X_DCDC2_LDO3_V_RAMP;
465d29f54dfSOlliver Schinagl 			mask = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK |
466d29f54dfSOlliver Schinagl 			       AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK;
467d29f54dfSOlliver Schinagl 			enable = (ramp > 0) ?
468a0fc8b6aSOndrej Jirman 				 AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN : 0;
469d29f54dfSOlliver Schinagl 			break;
470d29f54dfSOlliver Schinagl 		}
471d29f54dfSOlliver Schinagl 
472d29f54dfSOlliver Schinagl 		if (rate_count > 0)
473d29f54dfSOlliver Schinagl 			break;
474d29f54dfSOlliver Schinagl 
475df561f66SGustavo A. R. Silva 		fallthrough;
476d29f54dfSOlliver Schinagl 	default:
477d29f54dfSOlliver Schinagl 		/* Not supported for this regulator */
478d29f54dfSOlliver Schinagl 		return -ENOTSUPP;
479d29f54dfSOlliver Schinagl 	}
480d29f54dfSOlliver Schinagl 
481d29f54dfSOlliver Schinagl 	if (ramp == 0) {
482d29f54dfSOlliver Schinagl 		cfg = enable;
483d29f54dfSOlliver Schinagl 	} else {
484d29f54dfSOlliver Schinagl 		int i;
485d29f54dfSOlliver Schinagl 
486d29f54dfSOlliver Schinagl 		for (i = 0; i < rate_count; i++) {
48771dd2fe5SAxel Lin 			if (ramp > slew_rates[i])
488d29f54dfSOlliver Schinagl 				break;
48971dd2fe5SAxel Lin 
49071dd2fe5SAxel Lin 			if (id == AXP20X_DCDC2)
49171dd2fe5SAxel Lin 				cfg = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE(i);
49271dd2fe5SAxel Lin 			else
49371dd2fe5SAxel Lin 				cfg = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(i);
494d29f54dfSOlliver Schinagl 		}
495d29f54dfSOlliver Schinagl 
496d29f54dfSOlliver Schinagl 		if (cfg == 0xff) {
497d29f54dfSOlliver Schinagl 			dev_err(axp20x->dev, "unsupported ramp value %d", ramp);
498d29f54dfSOlliver Schinagl 			return -EINVAL;
499d29f54dfSOlliver Schinagl 		}
500d29f54dfSOlliver Schinagl 
501d29f54dfSOlliver Schinagl 		cfg |= enable;
502d29f54dfSOlliver Schinagl 	}
503d29f54dfSOlliver Schinagl 
504d29f54dfSOlliver Schinagl 	return regmap_update_bits(axp20x->regmap, reg, mask, cfg);
505d29f54dfSOlliver Schinagl }
506d29f54dfSOlliver Schinagl 
axp20x_regulator_enable_regmap(struct regulator_dev * rdev)50777e3e3b1SOlliver Schinagl static int axp20x_regulator_enable_regmap(struct regulator_dev *rdev)
50877e3e3b1SOlliver Schinagl {
50977e3e3b1SOlliver Schinagl 	struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
51004d1446bSAxel Lin 	int id = rdev_get_id(rdev);
5116f3656f3SColin Ian King 
51277e3e3b1SOlliver Schinagl 	switch (axp20x->variant) {
51377e3e3b1SOlliver Schinagl 	case AXP209_ID:
51404d1446bSAxel Lin 		if ((id == AXP20X_LDO3) &&
51577e3e3b1SOlliver Schinagl 		    rdev->constraints && rdev->constraints->soft_start) {
51677e3e3b1SOlliver Schinagl 			int v_out;
51777e3e3b1SOlliver Schinagl 			int ret;
51877e3e3b1SOlliver Schinagl 
51977e3e3b1SOlliver Schinagl 			/*
52077e3e3b1SOlliver Schinagl 			 * On some boards, the LDO3 can be overloaded when
52177e3e3b1SOlliver Schinagl 			 * turning on, causing the entire PMIC to shutdown
52277e3e3b1SOlliver Schinagl 			 * without warning. Turning it on at the minimal voltage
52377e3e3b1SOlliver Schinagl 			 * and then setting the voltage to the requested value
52477e3e3b1SOlliver Schinagl 			 * works reliably.
52577e3e3b1SOlliver Schinagl 			 */
52677e3e3b1SOlliver Schinagl 			if (regulator_is_enabled_regmap(rdev))
52777e3e3b1SOlliver Schinagl 				break;
52877e3e3b1SOlliver Schinagl 
52977e3e3b1SOlliver Schinagl 			v_out = regulator_get_voltage_sel_regmap(rdev);
53077e3e3b1SOlliver Schinagl 			if (v_out < 0)
53177e3e3b1SOlliver Schinagl 				return v_out;
53277e3e3b1SOlliver Schinagl 
53377e3e3b1SOlliver Schinagl 			if (v_out == 0)
53477e3e3b1SOlliver Schinagl 				break;
53577e3e3b1SOlliver Schinagl 
53677e3e3b1SOlliver Schinagl 			ret = regulator_set_voltage_sel_regmap(rdev, 0x00);
53777e3e3b1SOlliver Schinagl 			/*
53877e3e3b1SOlliver Schinagl 			 * A small pause is needed between
53977e3e3b1SOlliver Schinagl 			 * setting the voltage and enabling the LDO to give the
54077e3e3b1SOlliver Schinagl 			 * internal state machine time to process the request.
54177e3e3b1SOlliver Schinagl 			 */
54277e3e3b1SOlliver Schinagl 			usleep_range(1000, 5000);
54377e3e3b1SOlliver Schinagl 			ret |= regulator_enable_regmap(rdev);
54477e3e3b1SOlliver Schinagl 			ret |= regulator_set_voltage_sel_regmap(rdev, v_out);
54577e3e3b1SOlliver Schinagl 
54677e3e3b1SOlliver Schinagl 			return ret;
54777e3e3b1SOlliver Schinagl 		}
54877e3e3b1SOlliver Schinagl 		break;
54977e3e3b1SOlliver Schinagl 	default:
55077e3e3b1SOlliver Schinagl 		/* No quirks */
55177e3e3b1SOlliver Schinagl 		break;
55277e3e3b1SOlliver Schinagl 	}
55377e3e3b1SOlliver Schinagl 
55477e3e3b1SOlliver Schinagl 	return regulator_enable_regmap(rdev);
55577e3e3b1SOlliver Schinagl };
55677e3e3b1SOlliver Schinagl 
557ef306e44SBhumika Goyal static const struct regulator_ops axp20x_ops_fixed = {
558dfe7a1b0SCarlo Caione 	.list_voltage		= regulator_list_voltage_linear,
559dfe7a1b0SCarlo Caione };
560dfe7a1b0SCarlo Caione 
561ef306e44SBhumika Goyal static const struct regulator_ops axp20x_ops_range = {
562dfe7a1b0SCarlo Caione 	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
563dfe7a1b0SCarlo Caione 	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
56413d57e64SChen-Yu Tsai 	.list_voltage		= regulator_list_voltage_linear_range,
565dfe7a1b0SCarlo Caione 	.enable			= regulator_enable_regmap,
566dfe7a1b0SCarlo Caione 	.disable		= regulator_disable_regmap,
567dfe7a1b0SCarlo Caione 	.is_enabled		= regulator_is_enabled_regmap,
568dfe7a1b0SCarlo Caione };
569dfe7a1b0SCarlo Caione 
570ef306e44SBhumika Goyal static const struct regulator_ops axp20x_ops = {
571dfe7a1b0SCarlo Caione 	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
572dfe7a1b0SCarlo Caione 	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
573dfe7a1b0SCarlo Caione 	.list_voltage		= regulator_list_voltage_linear,
57477e3e3b1SOlliver Schinagl 	.enable			= axp20x_regulator_enable_regmap,
575dfe7a1b0SCarlo Caione 	.disable		= regulator_disable_regmap,
576dfe7a1b0SCarlo Caione 	.is_enabled		= regulator_is_enabled_regmap,
577d29f54dfSOlliver Schinagl 	.set_ramp_delay		= axp20x_set_ramp_delay,
578dfe7a1b0SCarlo Caione };
579dfe7a1b0SCarlo Caione 
580ef306e44SBhumika Goyal static const struct regulator_ops axp20x_ops_sw = {
5811b82b4e4SBoris BREZILLON 	.enable			= regulator_enable_regmap,
5821b82b4e4SBoris BREZILLON 	.disable		= regulator_disable_regmap,
5831b82b4e4SBoris BREZILLON 	.is_enabled		= regulator_is_enabled_regmap,
5841b82b4e4SBoris BREZILLON };
5851b82b4e4SBoris BREZILLON 
58660ab7f41SMatti Vaittinen static const struct linear_range axp20x_ldo4_ranges[] = {
587db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1250000,
588db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_1250mV_START,
589db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_1250mV_END,
590db4a555fSOlliver Schinagl 			       0),
591db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1300000,
592db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_1300mV_START,
593db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_1300mV_END,
594db4a555fSOlliver Schinagl 			       100000),
595db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(2500000,
596db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_2500mV_START,
597db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_2500mV_END,
598db4a555fSOlliver Schinagl 			       0),
599db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(2700000,
600db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_2700mV_START,
601db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_2700mV_END,
602db4a555fSOlliver Schinagl 			       100000),
603db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(3000000,
604db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_3000mV_START,
605db4a555fSOlliver Schinagl 			       AXP20X_LDO4_V_OUT_3000mV_END,
606db4a555fSOlliver Schinagl 			       100000),
60713d57e64SChen-Yu Tsai };
60813d57e64SChen-Yu Tsai 
609dfe7a1b0SCarlo Caione static const struct regulator_desc axp20x_regulators[] = {
610866bd951SBoris BREZILLON 	AXP_DESC(AXP20X, DCDC2, "dcdc2", "vin2", 700, 2275, 25,
611db4a555fSOlliver Schinagl 		 AXP20X_DCDC2_V_OUT, AXP20X_DCDC2_V_OUT_MASK,
612db4a555fSOlliver Schinagl 		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_DCDC2_MASK),
613866bd951SBoris BREZILLON 	AXP_DESC(AXP20X, DCDC3, "dcdc3", "vin3", 700, 3500, 25,
614db4a555fSOlliver Schinagl 		 AXP20X_DCDC3_V_OUT, AXP20X_DCDC3_V_OUT_MASK,
615db4a555fSOlliver Schinagl 		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_DCDC3_MASK),
616866bd951SBoris BREZILLON 	AXP_DESC_FIXED(AXP20X, LDO1, "ldo1", "acin", 1300),
617866bd951SBoris BREZILLON 	AXP_DESC(AXP20X, LDO2, "ldo2", "ldo24in", 1800, 3300, 100,
618fbb5a79dSIcenowy Zheng 		 AXP20X_LDO24_V_OUT, AXP20X_LDO2_V_OUT_MASK,
619db4a555fSOlliver Schinagl 		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO2_MASK),
620866bd951SBoris BREZILLON 	AXP_DESC(AXP20X, LDO3, "ldo3", "ldo3in", 700, 3500, 25,
621db4a555fSOlliver Schinagl 		 AXP20X_LDO3_V_OUT, AXP20X_LDO3_V_OUT_MASK,
622db4a555fSOlliver Schinagl 		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO3_MASK),
623db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP20X, LDO4, "ldo4", "ldo24in",
624db4a555fSOlliver Schinagl 			axp20x_ldo4_ranges, AXP20X_LDO4_V_OUT_NUM_VOLTAGES,
625fbb5a79dSIcenowy Zheng 			AXP20X_LDO24_V_OUT, AXP20X_LDO4_V_OUT_MASK,
626db4a555fSOlliver Schinagl 			AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO4_MASK),
627866bd951SBoris BREZILLON 	AXP_DESC_IO(AXP20X, LDO5, "ldo5", "ldo5in", 1800, 3300, 100,
628db4a555fSOlliver Schinagl 		    AXP20X_LDO5_V_OUT, AXP20X_LDO5_V_OUT_MASK,
629db4a555fSOlliver Schinagl 		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
630880fe82dSChen-Yu Tsai 		    AXP20X_IO_ENABLED, AXP20X_IO_DISABLED),
631dfe7a1b0SCarlo Caione };
632dfe7a1b0SCarlo Caione 
6331b82b4e4SBoris BREZILLON static const struct regulator_desc axp22x_regulators[] = {
6341b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
635db4a555fSOlliver Schinagl 		 AXP22X_DCDC1_V_OUT, AXP22X_DCDC1_V_OUT_MASK,
636db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC1_MASK),
6371b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DCDC2, "dcdc2", "vin2", 600, 1540, 20,
638db4a555fSOlliver Schinagl 		 AXP22X_DCDC2_V_OUT, AXP22X_DCDC2_V_OUT_MASK,
639db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC2_MASK),
6401b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DCDC3, "dcdc3", "vin3", 600, 1860, 20,
641db4a555fSOlliver Schinagl 		 AXP22X_DCDC3_V_OUT, AXP22X_DCDC3_V_OUT_MASK,
642db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC3_MASK),
6431b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DCDC4, "dcdc4", "vin4", 600, 1540, 20,
644d0233770SAxel Lin 		 AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT_MASK,
645db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC4_MASK),
6461b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
647db4a555fSOlliver Schinagl 		 AXP22X_DCDC5_V_OUT, AXP22X_DCDC5_V_OUT_MASK,
648db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC5_MASK),
6491b82b4e4SBoris BREZILLON 	/* secondary switchable output of DCDC1 */
650db4a555fSOlliver Schinagl 	AXP_DESC_SW(AXP22X, DC1SW, "dc1sw", NULL,
651db4a555fSOlliver Schinagl 		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
6521b82b4e4SBoris BREZILLON 	/* LDO regulator internally chained to DCDC5 */
6537118f19cSChen-Yu Tsai 	AXP_DESC(AXP22X, DC5LDO, "dc5ldo", NULL, 700, 1400, 100,
654db4a555fSOlliver Schinagl 		 AXP22X_DC5LDO_V_OUT, AXP22X_DC5LDO_V_OUT_MASK,
655db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DC5LDO_MASK),
6561b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
657db4a555fSOlliver Schinagl 		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
658db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO1_MASK),
6591b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
660db4a555fSOlliver Schinagl 		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
661db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO2_MASK),
6621b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
663db4a555fSOlliver Schinagl 		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
664db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP22X_PWR_OUT_ALDO3_MASK),
6651b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
666db4a555fSOlliver Schinagl 		 AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
667db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
6681b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DLDO2, "dldo2", "dldoin", 700, 3300, 100,
669291de1d1SDingHua Ma 		 AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
670db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
6711b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
672db4a555fSOlliver Schinagl 		 AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
673db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
6741b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
675db4a555fSOlliver Schinagl 		 AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
676db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
6771b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, ELDO1, "eldo1", "eldoin", 700, 3300, 100,
678db4a555fSOlliver Schinagl 		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
679db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
6801b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, ELDO2, "eldo2", "eldoin", 700, 3300, 100,
681db4a555fSOlliver Schinagl 		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
682f40ddaa0SChen-Yu Tsai 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
6831b82b4e4SBoris BREZILLON 	AXP_DESC(AXP22X, ELDO3, "eldo3", "eldoin", 700, 3300, 100,
684db4a555fSOlliver Schinagl 		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
685db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
686f40d4896SHans de Goede 	/* Note the datasheet only guarantees reliable operation up to
687f40d4896SHans de Goede 	 * 3.3V, this needs to be enforced via dts provided constraints */
688f40d4896SHans de Goede 	AXP_DESC_IO(AXP22X, LDO_IO0, "ldo_io0", "ips", 700, 3800, 100,
689db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
690db4a555fSOlliver Schinagl 		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
6911b82b4e4SBoris BREZILLON 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
692f40d4896SHans de Goede 	/* Note the datasheet only guarantees reliable operation up to
693f40d4896SHans de Goede 	 * 3.3V, this needs to be enforced via dts provided constraints */
694f40d4896SHans de Goede 	AXP_DESC_IO(AXP22X, LDO_IO1, "ldo_io1", "ips", 700, 3800, 100,
695db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
696db4a555fSOlliver Schinagl 		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
6971b82b4e4SBoris BREZILLON 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
6981b82b4e4SBoris BREZILLON 	AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000),
6991b82b4e4SBoris BREZILLON };
7001b82b4e4SBoris BREZILLON 
701636e2a39SHans de Goede static const struct regulator_desc axp22x_drivevbus_regulator = {
702636e2a39SHans de Goede 	.name		= "drivevbus",
703636e2a39SHans de Goede 	.supply_name	= "drivevbus",
704636e2a39SHans de Goede 	.of_match	= of_match_ptr("drivevbus"),
705636e2a39SHans de Goede 	.regulators_node = of_match_ptr("regulators"),
706636e2a39SHans de Goede 	.type		= REGULATOR_VOLTAGE,
707636e2a39SHans de Goede 	.owner		= THIS_MODULE,
708636e2a39SHans de Goede 	.enable_reg	= AXP20X_VBUS_IPSOUT_MGMT,
709db4a555fSOlliver Schinagl 	.enable_mask	= AXP20X_VBUS_IPSOUT_MGMT_MASK,
710636e2a39SHans de Goede 	.ops		= &axp20x_ops_sw,
711636e2a39SHans de Goede };
712636e2a39SHans de Goede 
71360fd7eb8SMartin Botka static const struct linear_range axp313a_dcdc1_ranges[] = {
71460fd7eb8SMartin Botka 	REGULATOR_LINEAR_RANGE(500000,   0,  70,  10000),
71560fd7eb8SMartin Botka 	REGULATOR_LINEAR_RANGE(1220000, 71,  87,  20000),
71660fd7eb8SMartin Botka 	REGULATOR_LINEAR_RANGE(1600000, 88, 106, 100000),
71760fd7eb8SMartin Botka };
71860fd7eb8SMartin Botka 
71960fd7eb8SMartin Botka static const struct linear_range axp313a_dcdc2_ranges[] = {
72060fd7eb8SMartin Botka 	REGULATOR_LINEAR_RANGE(500000,   0, 70, 10000),
72160fd7eb8SMartin Botka 	REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
72260fd7eb8SMartin Botka };
72360fd7eb8SMartin Botka 
72460fd7eb8SMartin Botka /*
72560fd7eb8SMartin Botka  * This is deviating from the datasheet. The values here are taken from the
72660fd7eb8SMartin Botka  * BSP driver and have been confirmed by measurements.
72760fd7eb8SMartin Botka  */
72860fd7eb8SMartin Botka static const struct linear_range axp313a_dcdc3_ranges[] = {
72960fd7eb8SMartin Botka 	REGULATOR_LINEAR_RANGE(500000,   0,  70, 10000),
73060fd7eb8SMartin Botka 	REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000),
73160fd7eb8SMartin Botka };
73260fd7eb8SMartin Botka 
73360fd7eb8SMartin Botka static const struct regulator_desc axp313a_regulators[] = {
73460fd7eb8SMartin Botka 	AXP_DESC_RANGES(AXP313A, DCDC1, "dcdc1", "vin1",
73560fd7eb8SMartin Botka 			axp313a_dcdc1_ranges, AXP313A_DCDC1_NUM_VOLTAGES,
73660fd7eb8SMartin Botka 			AXP313A_DCDC1_CONRTOL, AXP313A_DCDC_V_OUT_MASK,
73760fd7eb8SMartin Botka 			AXP313A_OUTPUT_CONTROL, BIT(0)),
73860fd7eb8SMartin Botka 	AXP_DESC_RANGES(AXP313A, DCDC2, "dcdc2", "vin2",
73960fd7eb8SMartin Botka 			axp313a_dcdc2_ranges, AXP313A_DCDC23_NUM_VOLTAGES,
74060fd7eb8SMartin Botka 			AXP313A_DCDC2_CONRTOL, AXP313A_DCDC_V_OUT_MASK,
74160fd7eb8SMartin Botka 			AXP313A_OUTPUT_CONTROL, BIT(1)),
74260fd7eb8SMartin Botka 	AXP_DESC_RANGES(AXP313A, DCDC3, "dcdc3", "vin3",
74360fd7eb8SMartin Botka 			axp313a_dcdc3_ranges, AXP313A_DCDC23_NUM_VOLTAGES,
74460fd7eb8SMartin Botka 			AXP313A_DCDC3_CONRTOL, AXP313A_DCDC_V_OUT_MASK,
74560fd7eb8SMartin Botka 			AXP313A_OUTPUT_CONTROL, BIT(2)),
74660fd7eb8SMartin Botka 	AXP_DESC(AXP313A, ALDO1, "aldo1", "vin1", 500, 3500, 100,
74760fd7eb8SMartin Botka 		 AXP313A_ALDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK,
74860fd7eb8SMartin Botka 		 AXP313A_OUTPUT_CONTROL, BIT(3)),
74960fd7eb8SMartin Botka 	AXP_DESC(AXP313A, DLDO1, "dldo1", "vin1", 500, 3500, 100,
75060fd7eb8SMartin Botka 		 AXP313A_DLDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK,
75160fd7eb8SMartin Botka 		 AXP313A_OUTPUT_CONTROL, BIT(4)),
75260fd7eb8SMartin Botka 	AXP_DESC_FIXED(AXP313A, RTC_LDO, "rtc-ldo", "vin1", 1800),
75360fd7eb8SMartin Botka };
75460fd7eb8SMartin Botka 
755d81851c1SChen-Yu Tsai /* DCDC ranges shared with AXP813 */
75660ab7f41SMatti Vaittinen static const struct linear_range axp803_dcdc234_ranges[] = {
757db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(500000,
758db4a555fSOlliver Schinagl 			       AXP803_DCDC234_500mV_START,
759db4a555fSOlliver Schinagl 			       AXP803_DCDC234_500mV_END,
760db4a555fSOlliver Schinagl 			       10000),
761db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1220000,
762db4a555fSOlliver Schinagl 			       AXP803_DCDC234_1220mV_START,
763db4a555fSOlliver Schinagl 			       AXP803_DCDC234_1220mV_END,
764db4a555fSOlliver Schinagl 			       20000),
7651dbe0ccbSIcenowy Zheng };
7661dbe0ccbSIcenowy Zheng 
76760ab7f41SMatti Vaittinen static const struct linear_range axp803_dcdc5_ranges[] = {
768db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(800000,
769db4a555fSOlliver Schinagl 			       AXP803_DCDC5_800mV_START,
770db4a555fSOlliver Schinagl 			       AXP803_DCDC5_800mV_END,
771db4a555fSOlliver Schinagl 			       10000),
772db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1140000,
773db4a555fSOlliver Schinagl 			       AXP803_DCDC5_1140mV_START,
774db4a555fSOlliver Schinagl 			       AXP803_DCDC5_1140mV_END,
775db4a555fSOlliver Schinagl 			       20000),
7761dbe0ccbSIcenowy Zheng };
7771dbe0ccbSIcenowy Zheng 
77860ab7f41SMatti Vaittinen static const struct linear_range axp803_dcdc6_ranges[] = {
779db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(600000,
780db4a555fSOlliver Schinagl 			       AXP803_DCDC6_600mV_START,
781db4a555fSOlliver Schinagl 			       AXP803_DCDC6_600mV_END,
782db4a555fSOlliver Schinagl 			       10000),
783db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1120000,
784db4a555fSOlliver Schinagl 			       AXP803_DCDC6_1120mV_START,
785db4a555fSOlliver Schinagl 			       AXP803_DCDC6_1120mV_END,
786db4a555fSOlliver Schinagl 			       20000),
7871dbe0ccbSIcenowy Zheng };
7881dbe0ccbSIcenowy Zheng 
789db4a555fSOlliver Schinagl /* AXP806's CLDO2 and AXP809's DLDO1 share the same range */
79060ab7f41SMatti Vaittinen static const struct linear_range axp803_dldo2_ranges[] = {
791db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(700000,
792db4a555fSOlliver Schinagl 			       AXP803_DLDO2_700mV_START,
793db4a555fSOlliver Schinagl 			       AXP803_DLDO2_700mV_END,
794db4a555fSOlliver Schinagl 			       100000),
795db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(3400000,
796db4a555fSOlliver Schinagl 			       AXP803_DLDO2_3400mV_START,
797db4a555fSOlliver Schinagl 			       AXP803_DLDO2_3400mV_END,
798db4a555fSOlliver Schinagl 			       200000),
7991dbe0ccbSIcenowy Zheng };
8001dbe0ccbSIcenowy Zheng 
8011dbe0ccbSIcenowy Zheng static const struct regulator_desc axp803_regulators[] = {
8021dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
803db4a555fSOlliver Schinagl 		 AXP803_DCDC1_V_OUT, AXP803_DCDC1_V_OUT_MASK,
804db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC1_MASK),
805db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP803, DCDC2, "dcdc2", "vin2",
806db4a555fSOlliver Schinagl 			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
807db4a555fSOlliver Schinagl 			AXP803_DCDC2_V_OUT, AXP803_DCDC2_V_OUT_MASK,
808db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC2_MASK),
809db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP803, DCDC3, "dcdc3", "vin3",
810db4a555fSOlliver Schinagl 			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
811db4a555fSOlliver Schinagl 			AXP803_DCDC3_V_OUT, AXP803_DCDC3_V_OUT_MASK,
812db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC3_MASK),
813db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP803, DCDC4, "dcdc4", "vin4",
814db4a555fSOlliver Schinagl 			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
815db4a555fSOlliver Schinagl 			AXP803_DCDC4_V_OUT, AXP803_DCDC4_V_OUT_MASK,
816db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC4_MASK),
817db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP803, DCDC5, "dcdc5", "vin5",
818db4a555fSOlliver Schinagl 			axp803_dcdc5_ranges, AXP803_DCDC5_NUM_VOLTAGES,
819db4a555fSOlliver Schinagl 			AXP803_DCDC5_V_OUT, AXP803_DCDC5_V_OUT_MASK,
820db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC5_MASK),
821db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP803, DCDC6, "dcdc6", "vin6",
822db4a555fSOlliver Schinagl 			axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
823db4a555fSOlliver Schinagl 			AXP803_DCDC6_V_OUT, AXP803_DCDC6_V_OUT_MASK,
824db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC6_MASK),
8251dbe0ccbSIcenowy Zheng 	/* secondary switchable output of DCDC1 */
826db4a555fSOlliver Schinagl 	AXP_DESC_SW(AXP803, DC1SW, "dc1sw", NULL,
827db4a555fSOlliver Schinagl 		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
8281dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
829db4a555fSOlliver Schinagl 		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
830db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK),
8311dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
832252d1c20SVasily Khoruzhick 		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
833db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK),
8341dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
835db4a555fSOlliver Schinagl 		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
836db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO3_MASK),
8371dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
838db4a555fSOlliver Schinagl 		 AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
839db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
840db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP803, DLDO2, "dldo2", "dldoin",
841db4a555fSOlliver Schinagl 			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
842252d1c20SVasily Khoruzhick 			AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
843db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
8441dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
845db4a555fSOlliver Schinagl 		 AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
846db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
8471dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
848db4a555fSOlliver Schinagl 		 AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
849db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
8501dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, ELDO1, "eldo1", "eldoin", 700, 1900, 50,
851db4a555fSOlliver Schinagl 		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
852db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
8531dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, ELDO2, "eldo2", "eldoin", 700, 1900, 50,
854db4a555fSOlliver Schinagl 		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
855db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
8561dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, ELDO3, "eldo3", "eldoin", 700, 1900, 50,
857252d1c20SVasily Khoruzhick 		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
858db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
8591dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, FLDO1, "fldo1", "fldoin", 700, 1450, 50,
860db4a555fSOlliver Schinagl 		 AXP803_FLDO1_V_OUT, AXP803_FLDO1_V_OUT_MASK,
861db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO1_MASK),
8621dbe0ccbSIcenowy Zheng 	AXP_DESC(AXP803, FLDO2, "fldo2", "fldoin", 700, 1450, 50,
863db4a555fSOlliver Schinagl 		 AXP803_FLDO2_V_OUT, AXP803_FLDO2_V_OUT_MASK,
864db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO2_MASK),
8651dbe0ccbSIcenowy Zheng 	AXP_DESC_IO(AXP803, LDO_IO0, "ldo-io0", "ips", 700, 3300, 100,
866db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
867db4a555fSOlliver Schinagl 		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
8681dbe0ccbSIcenowy Zheng 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
8691dbe0ccbSIcenowy Zheng 	AXP_DESC_IO(AXP803, LDO_IO1, "ldo-io1", "ips", 700, 3300, 100,
870db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
871db4a555fSOlliver Schinagl 		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
8721dbe0ccbSIcenowy Zheng 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
8731dbe0ccbSIcenowy Zheng 	AXP_DESC_FIXED(AXP803, RTC_LDO, "rtc-ldo", "ips", 3000),
8741dbe0ccbSIcenowy Zheng };
8751dbe0ccbSIcenowy Zheng 
87660ab7f41SMatti Vaittinen static const struct linear_range axp806_dcdca_ranges[] = {
877db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(600000,
878db4a555fSOlliver Schinagl 			       AXP806_DCDCA_600mV_START,
879db4a555fSOlliver Schinagl 			       AXP806_DCDCA_600mV_END,
880db4a555fSOlliver Schinagl 			       10000),
881db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1120000,
882db4a555fSOlliver Schinagl 			       AXP806_DCDCA_1120mV_START,
883db4a555fSOlliver Schinagl 			       AXP806_DCDCA_1120mV_END,
884db4a555fSOlliver Schinagl 			       20000),
8852ca342d3SChen-Yu Tsai };
8862ca342d3SChen-Yu Tsai 
88760ab7f41SMatti Vaittinen static const struct linear_range axp806_dcdcd_ranges[] = {
888db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(600000,
889db4a555fSOlliver Schinagl 			       AXP806_DCDCD_600mV_START,
890db4a555fSOlliver Schinagl 			       AXP806_DCDCD_600mV_END,
891db4a555fSOlliver Schinagl 			       20000),
892db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1600000,
8931ef55fedSJernej Skrabec 			       AXP806_DCDCD_1600mV_START,
8941ef55fedSJernej Skrabec 			       AXP806_DCDCD_1600mV_END,
895db4a555fSOlliver Schinagl 			       100000),
8962ca342d3SChen-Yu Tsai };
8972ca342d3SChen-Yu Tsai 
8982ca342d3SChen-Yu Tsai static const struct regulator_desc axp806_regulators[] = {
899db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP806, DCDCA, "dcdca", "vina",
900db4a555fSOlliver Schinagl 			axp806_dcdca_ranges, AXP806_DCDCA_NUM_VOLTAGES,
901db4a555fSOlliver Schinagl 			AXP806_DCDCA_V_CTRL, AXP806_DCDCA_V_CTRL_MASK,
902db4a555fSOlliver Schinagl 			AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCA_MASK),
9032ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, DCDCB, "dcdcb", "vinb", 1000, 2550, 50,
9044afa60d3SOndrej Jirman 		 AXP806_DCDCB_V_CTRL, AXP806_DCDCB_V_CTRL_MASK,
905db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCB_MASK),
906db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP806, DCDCC, "dcdcc", "vinc",
907db4a555fSOlliver Schinagl 			axp806_dcdca_ranges, AXP806_DCDCA_NUM_VOLTAGES,
908db4a555fSOlliver Schinagl 			AXP806_DCDCC_V_CTRL, AXP806_DCDCC_V_CTRL_MASK,
909db4a555fSOlliver Schinagl 			AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCC_MASK),
910db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP806, DCDCD, "dcdcd", "vind",
911db4a555fSOlliver Schinagl 			axp806_dcdcd_ranges, AXP806_DCDCD_NUM_VOLTAGES,
912db4a555fSOlliver Schinagl 			AXP806_DCDCD_V_CTRL, AXP806_DCDCD_V_CTRL_MASK,
913db4a555fSOlliver Schinagl 			AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCD_MASK),
9142ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, DCDCE, "dcdce", "vine", 1100, 3400, 100,
915db4a555fSOlliver Schinagl 		 AXP806_DCDCE_V_CTRL, AXP806_DCDCE_V_CTRL_MASK,
916db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCE_MASK),
9172ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
918db4a555fSOlliver Schinagl 		 AXP806_ALDO1_V_CTRL, AXP806_ALDO1_V_CTRL_MASK,
919db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO1_MASK),
9202ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, ALDO2, "aldo2", "aldoin", 700, 3400, 100,
921db4a555fSOlliver Schinagl 		 AXP806_ALDO2_V_CTRL, AXP806_ALDO2_V_CTRL_MASK,
922db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO2_MASK),
9232ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
924db4a555fSOlliver Schinagl 		 AXP806_ALDO3_V_CTRL, AXP806_ALDO3_V_CTRL_MASK,
925db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO3_MASK),
9262ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, BLDO1, "bldo1", "bldoin", 700, 1900, 100,
927db4a555fSOlliver Schinagl 		 AXP806_BLDO1_V_CTRL, AXP806_BLDO1_V_CTRL_MASK,
928db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO1_MASK),
9292ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, BLDO2, "bldo2", "bldoin", 700, 1900, 100,
9304afa60d3SOndrej Jirman 		 AXP806_BLDO2_V_CTRL, AXP806_BLDO2_V_CTRL_MASK,
931db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO2_MASK),
9322ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, BLDO3, "bldo3", "bldoin", 700, 1900, 100,
933db4a555fSOlliver Schinagl 		 AXP806_BLDO3_V_CTRL, AXP806_BLDO3_V_CTRL_MASK,
934db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO3_MASK),
9352ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, BLDO4, "bldo4", "bldoin", 700, 1900, 100,
936db4a555fSOlliver Schinagl 		 AXP806_BLDO4_V_CTRL, AXP806_BLDO4_V_CTRL_MASK,
937db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO4_MASK),
9382ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, CLDO1, "cldo1", "cldoin", 700, 3300, 100,
939db4a555fSOlliver Schinagl 		 AXP806_CLDO1_V_CTRL, AXP806_CLDO1_V_CTRL_MASK,
940db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO1_MASK),
941db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP806, CLDO2, "cldo2", "cldoin",
942db4a555fSOlliver Schinagl 			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
943db4a555fSOlliver Schinagl 			AXP806_CLDO2_V_CTRL, AXP806_CLDO2_V_CTRL_MASK,
944db4a555fSOlliver Schinagl 			AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO2_MASK),
9452ca342d3SChen-Yu Tsai 	AXP_DESC(AXP806, CLDO3, "cldo3", "cldoin", 700, 3300, 100,
946db4a555fSOlliver Schinagl 		 AXP806_CLDO3_V_CTRL, AXP806_CLDO3_V_CTRL_MASK,
947db4a555fSOlliver Schinagl 		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO3_MASK),
948db4a555fSOlliver Schinagl 	AXP_DESC_SW(AXP806, SW, "sw", "swin",
949db4a555fSOlliver Schinagl 		    AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_SW_MASK),
9502ca342d3SChen-Yu Tsai };
9512ca342d3SChen-Yu Tsai 
95260ab7f41SMatti Vaittinen static const struct linear_range axp809_dcdc4_ranges[] = {
953db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(600000,
954db4a555fSOlliver Schinagl 			       AXP809_DCDC4_600mV_START,
955db4a555fSOlliver Schinagl 			       AXP809_DCDC4_600mV_END,
956db4a555fSOlliver Schinagl 			       20000),
957db4a555fSOlliver Schinagl 	REGULATOR_LINEAR_RANGE(1800000,
958db4a555fSOlliver Schinagl 			       AXP809_DCDC4_1800mV_START,
959db4a555fSOlliver Schinagl 			       AXP809_DCDC4_1800mV_END,
960db4a555fSOlliver Schinagl 			       100000),
961a51f9f46SChen-Yu Tsai };
962a51f9f46SChen-Yu Tsai 
963a51f9f46SChen-Yu Tsai static const struct regulator_desc axp809_regulators[] = {
964a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
965db4a555fSOlliver Schinagl 		 AXP22X_DCDC1_V_OUT, AXP22X_DCDC1_V_OUT_MASK,
966db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC1_MASK),
967a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, DCDC2, "dcdc2", "vin2", 600, 1540, 20,
968db4a555fSOlliver Schinagl 		 AXP22X_DCDC2_V_OUT, AXP22X_DCDC2_V_OUT_MASK,
969db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC2_MASK),
970a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, DCDC3, "dcdc3", "vin3", 600, 1860, 20,
971db4a555fSOlliver Schinagl 		 AXP22X_DCDC3_V_OUT, AXP22X_DCDC3_V_OUT_MASK,
972db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC3_MASK),
973db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP809, DCDC4, "dcdc4", "vin4",
974db4a555fSOlliver Schinagl 			axp809_dcdc4_ranges, AXP809_DCDC4_NUM_VOLTAGES,
975db4a555fSOlliver Schinagl 			AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT_MASK,
976db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC4_MASK),
977a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
978db4a555fSOlliver Schinagl 		 AXP22X_DCDC5_V_OUT, AXP22X_DCDC5_V_OUT_MASK,
979db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC5_MASK),
980a51f9f46SChen-Yu Tsai 	/* secondary switchable output of DCDC1 */
981db4a555fSOlliver Schinagl 	AXP_DESC_SW(AXP809, DC1SW, "dc1sw", NULL,
982db4a555fSOlliver Schinagl 		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
983a51f9f46SChen-Yu Tsai 	/* LDO regulator internally chained to DCDC5 */
984a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, DC5LDO, "dc5ldo", NULL, 700, 1400, 100,
985db4a555fSOlliver Schinagl 		 AXP22X_DC5LDO_V_OUT, AXP22X_DC5LDO_V_OUT_MASK,
986db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DC5LDO_MASK),
987a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
988db4a555fSOlliver Schinagl 		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
989db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO1_MASK),
990a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
991db4a555fSOlliver Schinagl 		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
992db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO2_MASK),
993a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
994db4a555fSOlliver Schinagl 		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
995db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ALDO3_MASK),
996db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP809, DLDO1, "dldo1", "dldoin",
997db4a555fSOlliver Schinagl 			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
998db4a555fSOlliver Schinagl 			AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
999db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
1000a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, DLDO2, "dldo2", "dldoin", 700, 3300, 100,
1001db4a555fSOlliver Schinagl 		 AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
1002db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
1003a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, ELDO1, "eldo1", "eldoin", 700, 3300, 100,
1004db4a555fSOlliver Schinagl 		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
1005db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
1006a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, ELDO2, "eldo2", "eldoin", 700, 3300, 100,
1007db4a555fSOlliver Schinagl 		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
1008db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
1009a51f9f46SChen-Yu Tsai 	AXP_DESC(AXP809, ELDO3, "eldo3", "eldoin", 700, 3300, 100,
1010db4a555fSOlliver Schinagl 		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
1011db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
1012618c8089SChen-Yu Tsai 	/*
1013618c8089SChen-Yu Tsai 	 * Note the datasheet only guarantees reliable operation up to
1014618c8089SChen-Yu Tsai 	 * 3.3V, this needs to be enforced via dts provided constraints
1015618c8089SChen-Yu Tsai 	 */
1016618c8089SChen-Yu Tsai 	AXP_DESC_IO(AXP809, LDO_IO0, "ldo_io0", "ips", 700, 3800, 100,
1017db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
1018db4a555fSOlliver Schinagl 		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
1019a51f9f46SChen-Yu Tsai 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
1020618c8089SChen-Yu Tsai 	/*
1021618c8089SChen-Yu Tsai 	 * Note the datasheet only guarantees reliable operation up to
1022618c8089SChen-Yu Tsai 	 * 3.3V, this needs to be enforced via dts provided constraints
1023618c8089SChen-Yu Tsai 	 */
1024618c8089SChen-Yu Tsai 	AXP_DESC_IO(AXP809, LDO_IO1, "ldo_io1", "ips", 700, 3800, 100,
1025db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
1026db4a555fSOlliver Schinagl 		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
1027a51f9f46SChen-Yu Tsai 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
1028a51f9f46SChen-Yu Tsai 	AXP_DESC_FIXED(AXP809, RTC_LDO, "rtc_ldo", "ips", 1800),
1029db4a555fSOlliver Schinagl 	AXP_DESC_SW(AXP809, SW, "sw", "swin",
1030db4a555fSOlliver Schinagl 		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_SW_MASK),
1031a51f9f46SChen-Yu Tsai };
1032a51f9f46SChen-Yu Tsai 
1033d81851c1SChen-Yu Tsai static const struct regulator_desc axp813_regulators[] = {
1034d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
1035db4a555fSOlliver Schinagl 		 AXP803_DCDC1_V_OUT, AXP803_DCDC1_V_OUT_MASK,
1036db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC1_MASK),
1037db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP813, DCDC2, "dcdc2", "vin2",
1038db4a555fSOlliver Schinagl 			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
1039db4a555fSOlliver Schinagl 			AXP803_DCDC2_V_OUT, AXP803_DCDC2_V_OUT_MASK,
1040db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC2_MASK),
1041db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP813, DCDC3, "dcdc3", "vin3",
1042db4a555fSOlliver Schinagl 			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
1043db4a555fSOlliver Schinagl 			AXP803_DCDC3_V_OUT, AXP803_DCDC3_V_OUT_MASK,
1044db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC3_MASK),
1045db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP813, DCDC4, "dcdc4", "vin4",
1046db4a555fSOlliver Schinagl 			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
1047db4a555fSOlliver Schinagl 			AXP803_DCDC4_V_OUT, AXP803_DCDC4_V_OUT_MASK,
1048db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC4_MASK),
1049db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP813, DCDC5, "dcdc5", "vin5",
1050db4a555fSOlliver Schinagl 			axp803_dcdc5_ranges, AXP803_DCDC5_NUM_VOLTAGES,
1051db4a555fSOlliver Schinagl 			AXP803_DCDC5_V_OUT, AXP803_DCDC5_V_OUT_MASK,
1052db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC5_MASK),
1053db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP813, DCDC6, "dcdc6", "vin6",
1054db4a555fSOlliver Schinagl 			axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
1055db4a555fSOlliver Schinagl 			AXP803_DCDC6_V_OUT, AXP803_DCDC6_V_OUT_MASK,
1056db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC6_MASK),
1057db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP813, DCDC7, "dcdc7", "vin7",
1058db4a555fSOlliver Schinagl 			axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
1059db4a555fSOlliver Schinagl 			AXP813_DCDC7_V_OUT, AXP813_DCDC7_V_OUT_MASK,
1060db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL1, AXP813_PWR_OUT_DCDC7_MASK),
1061d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
1062db4a555fSOlliver Schinagl 		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
1063db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK),
1064d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
1065d0233770SAxel Lin 		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
1066db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK),
1067d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
1068db4a555fSOlliver Schinagl 		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
1069db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO3_MASK),
1070d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
1071db4a555fSOlliver Schinagl 		 AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
1072db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
1073db4a555fSOlliver Schinagl 	AXP_DESC_RANGES(AXP813, DLDO2, "dldo2", "dldoin",
1074db4a555fSOlliver Schinagl 			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
1075d0233770SAxel Lin 			AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
1076db4a555fSOlliver Schinagl 			AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
1077d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
1078db4a555fSOlliver Schinagl 		 AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
1079db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
1080d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
1081db4a555fSOlliver Schinagl 		 AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
1082db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
1083d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, ELDO1, "eldo1", "eldoin", 700, 1900, 50,
1084db4a555fSOlliver Schinagl 		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
1085db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
1086d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, ELDO2, "eldo2", "eldoin", 700, 1900, 50,
1087db4a555fSOlliver Schinagl 		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
1088db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
1089d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, ELDO3, "eldo3", "eldoin", 700, 1900, 50,
1090d0233770SAxel Lin 		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
1091db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
1092d81851c1SChen-Yu Tsai 	/* to do / check ... */
1093d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, FLDO1, "fldo1", "fldoin", 700, 1450, 50,
1094db4a555fSOlliver Schinagl 		 AXP803_FLDO1_V_OUT, AXP803_FLDO1_V_OUT_MASK,
1095db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO1_MASK),
1096d81851c1SChen-Yu Tsai 	AXP_DESC(AXP813, FLDO2, "fldo2", "fldoin", 700, 1450, 50,
1097db4a555fSOlliver Schinagl 		 AXP803_FLDO2_V_OUT, AXP803_FLDO2_V_OUT_MASK,
1098db4a555fSOlliver Schinagl 		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO2_MASK),
1099d81851c1SChen-Yu Tsai 	/*
1100d81851c1SChen-Yu Tsai 	 * TODO: FLDO3 = {DCDC5, FLDOIN} / 2
1101d81851c1SChen-Yu Tsai 	 *
1102d81851c1SChen-Yu Tsai 	 * This means FLDO3 effectively switches supplies at runtime,
1103d81851c1SChen-Yu Tsai 	 * something the regulator subsystem does not support.
1104d81851c1SChen-Yu Tsai 	 */
1105d81851c1SChen-Yu Tsai 	AXP_DESC_FIXED(AXP813, RTC_LDO, "rtc-ldo", "ips", 1800),
1106d81851c1SChen-Yu Tsai 	AXP_DESC_IO(AXP813, LDO_IO0, "ldo-io0", "ips", 700, 3300, 100,
1107db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
1108db4a555fSOlliver Schinagl 		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
1109d81851c1SChen-Yu Tsai 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
1110d81851c1SChen-Yu Tsai 	AXP_DESC_IO(AXP813, LDO_IO1, "ldo-io1", "ips", 700, 3300, 100,
1111db4a555fSOlliver Schinagl 		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
1112db4a555fSOlliver Schinagl 		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
1113d81851c1SChen-Yu Tsai 		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
1114db4a555fSOlliver Schinagl 	AXP_DESC_SW(AXP813, SW, "sw", "swin",
1115db4a555fSOlliver Schinagl 		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
1116d81851c1SChen-Yu Tsai };
1117d81851c1SChen-Yu Tsai 
1118*9e72869dSShengyu Qu static const struct linear_range axp15060_dcdc234_ranges[] = {
1119*9e72869dSShengyu Qu 	REGULATOR_LINEAR_RANGE(500000,
1120*9e72869dSShengyu Qu 			       AXP15060_DCDC234_500mV_START,
1121*9e72869dSShengyu Qu 			       AXP15060_DCDC234_500mV_END,
1122*9e72869dSShengyu Qu 			       10000),
1123*9e72869dSShengyu Qu 	REGULATOR_LINEAR_RANGE(1220000,
1124*9e72869dSShengyu Qu 			       AXP15060_DCDC234_1220mV_START,
1125*9e72869dSShengyu Qu 			       AXP15060_DCDC234_1220mV_END,
1126*9e72869dSShengyu Qu 			       20000),
1127*9e72869dSShengyu Qu };
1128*9e72869dSShengyu Qu 
1129*9e72869dSShengyu Qu static const struct linear_range axp15060_dcdc5_ranges[] = {
1130*9e72869dSShengyu Qu 	REGULATOR_LINEAR_RANGE(800000,
1131*9e72869dSShengyu Qu 			       AXP15060_DCDC5_800mV_START,
1132*9e72869dSShengyu Qu 			       AXP15060_DCDC5_800mV_END,
1133*9e72869dSShengyu Qu 			       10000),
1134*9e72869dSShengyu Qu 	REGULATOR_LINEAR_RANGE(1140000,
1135*9e72869dSShengyu Qu 			       AXP15060_DCDC5_1140mV_START,
1136*9e72869dSShengyu Qu 			       AXP15060_DCDC5_1140mV_END,
1137*9e72869dSShengyu Qu 			       20000),
1138*9e72869dSShengyu Qu };
1139*9e72869dSShengyu Qu 
1140*9e72869dSShengyu Qu static const struct regulator_desc axp15060_regulators[] = {
1141*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, DCDC1, "dcdc1", "vin1", 1500, 3400, 100,
1142*9e72869dSShengyu Qu 		 AXP15060_DCDC1_V_CTRL, AXP15060_DCDC1_V_CTRL_MASK,
1143*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC1_MASK),
1144*9e72869dSShengyu Qu 	AXP_DESC_RANGES(AXP15060, DCDC2, "dcdc2", "vin2",
1145*9e72869dSShengyu Qu 			axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
1146*9e72869dSShengyu Qu 			AXP15060_DCDC2_V_CTRL, AXP15060_DCDC2_V_CTRL_MASK,
1147*9e72869dSShengyu Qu 			AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC2_MASK),
1148*9e72869dSShengyu Qu 	AXP_DESC_RANGES(AXP15060, DCDC3, "dcdc3", "vin3",
1149*9e72869dSShengyu Qu 			axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
1150*9e72869dSShengyu Qu 			AXP15060_DCDC3_V_CTRL, AXP15060_DCDC3_V_CTRL_MASK,
1151*9e72869dSShengyu Qu 			AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC3_MASK),
1152*9e72869dSShengyu Qu 	AXP_DESC_RANGES(AXP15060, DCDC4, "dcdc4", "vin4",
1153*9e72869dSShengyu Qu 			axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
1154*9e72869dSShengyu Qu 			AXP15060_DCDC4_V_CTRL, AXP15060_DCDC4_V_CTRL_MASK,
1155*9e72869dSShengyu Qu 			AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC4_MASK),
1156*9e72869dSShengyu Qu 	AXP_DESC_RANGES(AXP15060, DCDC5, "dcdc5", "vin5",
1157*9e72869dSShengyu Qu 			axp15060_dcdc5_ranges, AXP15060_DCDC5_NUM_VOLTAGES,
1158*9e72869dSShengyu Qu 			AXP15060_DCDC5_V_CTRL, AXP15060_DCDC5_V_CTRL_MASK,
1159*9e72869dSShengyu Qu 			AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC5_MASK),
1160*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, DCDC6, "dcdc6", "vin6", 500, 3400, 100,
1161*9e72869dSShengyu Qu 		 AXP15060_DCDC6_V_CTRL, AXP15060_DCDC6_V_CTRL_MASK,
1162*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC6_MASK),
1163*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
1164*9e72869dSShengyu Qu 		 AXP15060_ALDO1_V_CTRL, AXP15060_ALDO1_V_CTRL_MASK,
1165*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO1_MASK),
1166*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
1167*9e72869dSShengyu Qu 		 AXP15060_ALDO2_V_CTRL, AXP15060_ALDO2_V_CTRL_MASK,
1168*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO2_MASK),
1169*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
1170*9e72869dSShengyu Qu 		 AXP15060_ALDO3_V_CTRL, AXP15060_ALDO3_V_CTRL_MASK,
1171*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO3_MASK),
1172*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, ALDO4, "aldo4", "aldoin", 700, 3300, 100,
1173*9e72869dSShengyu Qu 		 AXP15060_ALDO4_V_CTRL, AXP15060_ALDO4_V_CTRL_MASK,
1174*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO4_MASK),
1175*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, ALDO5, "aldo5", "aldoin", 700, 3300, 100,
1176*9e72869dSShengyu Qu 		 AXP15060_ALDO5_V_CTRL, AXP15060_ALDO5_V_CTRL_MASK,
1177*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO5_MASK),
1178*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, BLDO1, "bldo1", "bldoin", 700, 3300, 100,
1179*9e72869dSShengyu Qu 		 AXP15060_BLDO1_V_CTRL, AXP15060_BLDO1_V_CTRL_MASK,
1180*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO1_MASK),
1181*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, BLDO2, "bldo2", "bldoin", 700, 3300, 100,
1182*9e72869dSShengyu Qu 		 AXP15060_BLDO2_V_CTRL, AXP15060_BLDO2_V_CTRL_MASK,
1183*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO2_MASK),
1184*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, BLDO3, "bldo3", "bldoin", 700, 3300, 100,
1185*9e72869dSShengyu Qu 		 AXP15060_BLDO3_V_CTRL, AXP15060_BLDO3_V_CTRL_MASK,
1186*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO3_MASK),
1187*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, BLDO4, "bldo4", "bldoin", 700, 3300, 100,
1188*9e72869dSShengyu Qu 		 AXP15060_BLDO4_V_CTRL, AXP15060_BLDO4_V_CTRL_MASK,
1189*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO4_MASK),
1190*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, BLDO5, "bldo5", "bldoin", 700, 3300, 100,
1191*9e72869dSShengyu Qu 		 AXP15060_BLDO5_V_CTRL, AXP15060_BLDO5_V_CTRL_MASK,
1192*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO5_MASK),
1193*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, CLDO1, "cldo1", "cldoin", 700, 3300, 100,
1194*9e72869dSShengyu Qu 		 AXP15060_CLDO1_V_CTRL, AXP15060_CLDO1_V_CTRL_MASK,
1195*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO1_MASK),
1196*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, CLDO2, "cldo2", "cldoin", 700, 3300, 100,
1197*9e72869dSShengyu Qu 		 AXP15060_CLDO2_V_CTRL, AXP15060_CLDO2_V_CTRL_MASK,
1198*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO2_MASK),
1199*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, CLDO3, "cldo3", "cldoin", 700, 3300, 100,
1200*9e72869dSShengyu Qu 		 AXP15060_CLDO3_V_CTRL, AXP15060_CLDO3_V_CTRL_MASK,
1201*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO3_MASK),
1202*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, CLDO4, "cldo4", "cldoin", 700, 4200, 100,
1203*9e72869dSShengyu Qu 		 AXP15060_CLDO4_V_CTRL, AXP15060_CLDO4_V_CTRL_MASK,
1204*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO4_MASK),
1205*9e72869dSShengyu Qu 	/* Supply comes from DCDC5 */
1206*9e72869dSShengyu Qu 	AXP_DESC(AXP15060, CPUSLDO, "cpusldo", NULL, 700, 1400, 50,
1207*9e72869dSShengyu Qu 		 AXP15060_CPUSLDO_V_CTRL, AXP15060_CPUSLDO_V_CTRL_MASK,
1208*9e72869dSShengyu Qu 		 AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CPUSLDO_MASK),
1209*9e72869dSShengyu Qu 	/* Supply comes from DCDC1 */
1210*9e72869dSShengyu Qu 	AXP_DESC_SW(AXP15060, SW, "sw", NULL,
1211*9e72869dSShengyu Qu 		    AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_SW_MASK),
1212*9e72869dSShengyu Qu 	/* Supply comes from ALDO1 */
1213*9e72869dSShengyu Qu 	AXP_DESC_FIXED(AXP15060, RTC_LDO, "rtc-ldo", NULL, 1800),
1214*9e72869dSShengyu Qu };
1215*9e72869dSShengyu Qu 
axp20x_set_dcdc_freq(struct platform_device * pdev,u32 dcdcfreq)1216dfe7a1b0SCarlo Caione static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
1217dfe7a1b0SCarlo Caione {
1218dfe7a1b0SCarlo Caione 	struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
12192ca342d3SChen-Yu Tsai 	unsigned int reg = AXP20X_DCDC_FREQ;
1220866bd951SBoris BREZILLON 	u32 min, max, def, step;
1221dfe7a1b0SCarlo Caione 
1222866bd951SBoris BREZILLON 	switch (axp20x->variant) {
1223866bd951SBoris BREZILLON 	case AXP202_ID:
1224866bd951SBoris BREZILLON 	case AXP209_ID:
1225866bd951SBoris BREZILLON 		min = 750;
1226866bd951SBoris BREZILLON 		max = 1875;
1227866bd951SBoris BREZILLON 		def = 1500;
1228866bd951SBoris BREZILLON 		step = 75;
1229866bd951SBoris BREZILLON 		break;
12301dbe0ccbSIcenowy Zheng 	case AXP803_ID:
1231d81851c1SChen-Yu Tsai 	case AXP813_ID:
12322ca342d3SChen-Yu Tsai 		/*
1233d81851c1SChen-Yu Tsai 		 * AXP803/AXP813 DCDC work frequency setting has the same
1234d81851c1SChen-Yu Tsai 		 * range and step as AXP22X, but at a different register.
12352ca342d3SChen-Yu Tsai 		 * (See include/linux/mfd/axp20x.h)
12362ca342d3SChen-Yu Tsai 		 */
12371dbe0ccbSIcenowy Zheng 		reg = AXP803_DCDC_FREQ_CTRL;
1238df561f66SGustavo A. R. Silva 		fallthrough;	/* to the check below */
12391dbe0ccbSIcenowy Zheng 	case AXP806_ID:
12401dbe0ccbSIcenowy Zheng 		/*
12411dbe0ccbSIcenowy Zheng 		 * AXP806 also have DCDC work frequency setting register at a
12421dbe0ccbSIcenowy Zheng 		 * different position.
12431dbe0ccbSIcenowy Zheng 		 */
12441dbe0ccbSIcenowy Zheng 		if (axp20x->variant == AXP806_ID)
12452ca342d3SChen-Yu Tsai 			reg = AXP806_DCDC_FREQ_CTRL;
1246df561f66SGustavo A. R. Silva 		fallthrough;
12471b82b4e4SBoris BREZILLON 	case AXP221_ID:
124804e0981cSChen-Yu Tsai 	case AXP223_ID:
1249a51f9f46SChen-Yu Tsai 	case AXP809_ID:
12501b82b4e4SBoris BREZILLON 		min = 1800;
12511b82b4e4SBoris BREZILLON 		max = 4050;
12521b82b4e4SBoris BREZILLON 		def = 3000;
12531b82b4e4SBoris BREZILLON 		step = 150;
12541b82b4e4SBoris BREZILLON 		break;
125560fd7eb8SMartin Botka 	case AXP313A_ID:
1256*9e72869dSShengyu Qu 	case AXP15060_ID:
125760fd7eb8SMartin Botka 		/* The DCDC PWM frequency seems to be fixed to 3 MHz. */
125860fd7eb8SMartin Botka 		if (dcdcfreq != 0) {
125960fd7eb8SMartin Botka 			dev_err(&pdev->dev,
1260*9e72869dSShengyu Qu 				"DCDC frequency on this PMIC is fixed to 3 MHz.\n");
126160fd7eb8SMartin Botka 			return -EINVAL;
126260fd7eb8SMartin Botka 		}
126360fd7eb8SMartin Botka 
126460fd7eb8SMartin Botka 		return 0;
1265866bd951SBoris BREZILLON 	default:
1266866bd951SBoris BREZILLON 		dev_err(&pdev->dev,
1267866bd951SBoris BREZILLON 			"Setting DCDC frequency for unsupported AXP variant\n");
1268866bd951SBoris BREZILLON 		return -EINVAL;
1269dfe7a1b0SCarlo Caione 	}
1270dfe7a1b0SCarlo Caione 
1271866bd951SBoris BREZILLON 	if (dcdcfreq == 0)
1272866bd951SBoris BREZILLON 		dcdcfreq = def;
1273866bd951SBoris BREZILLON 
1274866bd951SBoris BREZILLON 	if (dcdcfreq < min) {
1275866bd951SBoris BREZILLON 		dcdcfreq = min;
1276866bd951SBoris BREZILLON 		dev_warn(&pdev->dev, "DCDC frequency too low. Set to %ukHz\n",
1277866bd951SBoris BREZILLON 			 min);
1278dfe7a1b0SCarlo Caione 	}
1279dfe7a1b0SCarlo Caione 
1280866bd951SBoris BREZILLON 	if (dcdcfreq > max) {
1281866bd951SBoris BREZILLON 		dcdcfreq = max;
1282866bd951SBoris BREZILLON 		dev_warn(&pdev->dev, "DCDC frequency too high. Set to %ukHz\n",
1283866bd951SBoris BREZILLON 			 max);
1284866bd951SBoris BREZILLON 	}
1285866bd951SBoris BREZILLON 
1286866bd951SBoris BREZILLON 	dcdcfreq = (dcdcfreq - min) / step;
1287dfe7a1b0SCarlo Caione 
12882ca342d3SChen-Yu Tsai 	return regmap_update_bits(axp20x->regmap, reg,
1289dfe7a1b0SCarlo Caione 				  AXP20X_FREQ_DCDC_MASK, dcdcfreq);
1290dfe7a1b0SCarlo Caione }
1291dfe7a1b0SCarlo Caione 
axp20x_regulator_parse_dt(struct platform_device * pdev)1292dfe7a1b0SCarlo Caione static int axp20x_regulator_parse_dt(struct platform_device *pdev)
1293dfe7a1b0SCarlo Caione {
1294dfe7a1b0SCarlo Caione 	struct device_node *np, *regulators;
1295e78bf6beSPan Bian 	int ret = 0;
1296866bd951SBoris BREZILLON 	u32 dcdcfreq = 0;
1297dfe7a1b0SCarlo Caione 
1298dfe7a1b0SCarlo Caione 	np = of_node_get(pdev->dev.parent->of_node);
1299dfe7a1b0SCarlo Caione 	if (!np)
1300dfe7a1b0SCarlo Caione 		return 0;
1301dfe7a1b0SCarlo Caione 
1302a6016c52SBoris BREZILLON 	regulators = of_get_child_by_name(np, "regulators");
1303dfe7a1b0SCarlo Caione 	if (!regulators) {
1304dfe7a1b0SCarlo Caione 		dev_warn(&pdev->dev, "regulators node not found\n");
1305dfe7a1b0SCarlo Caione 	} else {
1306dfe7a1b0SCarlo Caione 		of_property_read_u32(regulators, "x-powers,dcdc-freq", &dcdcfreq);
1307dfe7a1b0SCarlo Caione 		ret = axp20x_set_dcdc_freq(pdev, dcdcfreq);
1308dfe7a1b0SCarlo Caione 		if (ret < 0) {
1309dfe7a1b0SCarlo Caione 			dev_err(&pdev->dev, "Error setting dcdc frequency: %d\n", ret);
1310dfe7a1b0SCarlo Caione 		}
1311dfe7a1b0SCarlo Caione 		of_node_put(regulators);
1312dfe7a1b0SCarlo Caione 	}
1313dfe7a1b0SCarlo Caione 
1314e78bf6beSPan Bian 	of_node_put(np);
1315e78bf6beSPan Bian 	return ret;
1316dfe7a1b0SCarlo Caione }
1317dfe7a1b0SCarlo Caione 
axp20x_set_dcdc_workmode(struct regulator_dev * rdev,int id,u32 workmode)1318dfe7a1b0SCarlo Caione static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 workmode)
1319dfe7a1b0SCarlo Caione {
1320866bd951SBoris BREZILLON 	struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
13212ca342d3SChen-Yu Tsai 	unsigned int reg = AXP20X_DCDC_MODE;
1322866bd951SBoris BREZILLON 	unsigned int mask;
1323dfe7a1b0SCarlo Caione 
1324866bd951SBoris BREZILLON 	switch (axp20x->variant) {
1325866bd951SBoris BREZILLON 	case AXP202_ID:
1326866bd951SBoris BREZILLON 	case AXP209_ID:
1327dfe7a1b0SCarlo Caione 		if ((id != AXP20X_DCDC2) && (id != AXP20X_DCDC3))
1328dfe7a1b0SCarlo Caione 			return -EINVAL;
1329dfe7a1b0SCarlo Caione 
1330866bd951SBoris BREZILLON 		mask = AXP20X_WORKMODE_DCDC2_MASK;
1331dfe7a1b0SCarlo Caione 		if (id == AXP20X_DCDC3)
1332dfe7a1b0SCarlo Caione 			mask = AXP20X_WORKMODE_DCDC3_MASK;
1333dfe7a1b0SCarlo Caione 
1334dfe7a1b0SCarlo Caione 		workmode <<= ffs(mask) - 1;
1335866bd951SBoris BREZILLON 		break;
1336866bd951SBoris BREZILLON 
13372ca342d3SChen-Yu Tsai 	case AXP806_ID:
13382ca342d3SChen-Yu Tsai 		/*
13392ca342d3SChen-Yu Tsai 		 * AXP806 DCDC regulator IDs have the same range as AXP22X.
13402ca342d3SChen-Yu Tsai 		 * (See include/linux/mfd/axp20x.h)
13412ca342d3SChen-Yu Tsai 		 */
134256394386SGustavo A. R. Silva 		reg = AXP806_DCDC_MODE_CTRL2;
1343df561f66SGustavo A. R. Silva 		fallthrough;	/* to the check below */
13441b82b4e4SBoris BREZILLON 	case AXP221_ID:
134504e0981cSChen-Yu Tsai 	case AXP223_ID:
1346a51f9f46SChen-Yu Tsai 	case AXP809_ID:
13471b82b4e4SBoris BREZILLON 		if (id < AXP22X_DCDC1 || id > AXP22X_DCDC5)
13481b82b4e4SBoris BREZILLON 			return -EINVAL;
13491b82b4e4SBoris BREZILLON 
13501b82b4e4SBoris BREZILLON 		mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP22X_DCDC1);
13511b82b4e4SBoris BREZILLON 		workmode <<= id - AXP22X_DCDC1;
13521b82b4e4SBoris BREZILLON 		break;
13531b82b4e4SBoris BREZILLON 
13541dbe0ccbSIcenowy Zheng 	case AXP803_ID:
13551dbe0ccbSIcenowy Zheng 		if (id < AXP803_DCDC1 || id > AXP803_DCDC6)
13561dbe0ccbSIcenowy Zheng 			return -EINVAL;
13571dbe0ccbSIcenowy Zheng 
13581dbe0ccbSIcenowy Zheng 		mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP803_DCDC1);
13591dbe0ccbSIcenowy Zheng 		workmode <<= id - AXP803_DCDC1;
13601dbe0ccbSIcenowy Zheng 		break;
13611dbe0ccbSIcenowy Zheng 
1362d81851c1SChen-Yu Tsai 	case AXP813_ID:
1363d81851c1SChen-Yu Tsai 		if (id < AXP813_DCDC1 || id > AXP813_DCDC7)
1364d81851c1SChen-Yu Tsai 			return -EINVAL;
1365d81851c1SChen-Yu Tsai 
1366d81851c1SChen-Yu Tsai 		mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP813_DCDC1);
1367d81851c1SChen-Yu Tsai 		workmode <<= id - AXP813_DCDC1;
1368d81851c1SChen-Yu Tsai 		break;
1369d81851c1SChen-Yu Tsai 
1370*9e72869dSShengyu Qu 	case AXP15060_ID:
1371*9e72869dSShengyu Qu 		reg = AXP15060_DCDC_MODE_CTRL2;
1372*9e72869dSShengyu Qu 		if (id < AXP15060_DCDC1 || id > AXP15060_DCDC6)
1373*9e72869dSShengyu Qu 			return -EINVAL;
1374*9e72869dSShengyu Qu 
1375*9e72869dSShengyu Qu 		mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP15060_DCDC1);
1376*9e72869dSShengyu Qu 		workmode <<= id - AXP15060_DCDC1;
1377*9e72869dSShengyu Qu 		break;
1378*9e72869dSShengyu Qu 
1379866bd951SBoris BREZILLON 	default:
1380866bd951SBoris BREZILLON 		/* should not happen */
1381866bd951SBoris BREZILLON 		WARN_ON(1);
1382866bd951SBoris BREZILLON 		return -EINVAL;
1383866bd951SBoris BREZILLON 	}
1384dfe7a1b0SCarlo Caione 
13852ca342d3SChen-Yu Tsai 	return regmap_update_bits(rdev->regmap, reg, mask, workmode);
13862ca342d3SChen-Yu Tsai }
13872ca342d3SChen-Yu Tsai 
13882ca342d3SChen-Yu Tsai /*
13892ca342d3SChen-Yu Tsai  * This function checks whether a regulator is part of a poly-phase
13902ca342d3SChen-Yu Tsai  * output setup based on the registers settings. Returns true if it is.
13912ca342d3SChen-Yu Tsai  */
axp20x_is_polyphase_slave(struct axp20x_dev * axp20x,int id)13922ca342d3SChen-Yu Tsai static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id)
13932ca342d3SChen-Yu Tsai {
13942ca342d3SChen-Yu Tsai 	u32 reg = 0;
13952ca342d3SChen-Yu Tsai 
13961dbe0ccbSIcenowy Zheng 	/*
1397d81851c1SChen-Yu Tsai 	 * Currently in our supported AXP variants, only AXP803, AXP806,
1398*9e72869dSShengyu Qu 	 * AXP813 and AXP15060 have polyphase regulators.
13991dbe0ccbSIcenowy Zheng 	 */
14001dbe0ccbSIcenowy Zheng 	switch (axp20x->variant) {
14011dbe0ccbSIcenowy Zheng 	case AXP803_ID:
1402ad92ceafSAxel Lin 	case AXP813_ID:
14031dbe0ccbSIcenowy Zheng 		regmap_read(axp20x->regmap, AXP803_POLYPHASE_CTRL, &reg);
14042ca342d3SChen-Yu Tsai 
14051dbe0ccbSIcenowy Zheng 		switch (id) {
14061dbe0ccbSIcenowy Zheng 		case AXP803_DCDC3:
1407db4a555fSOlliver Schinagl 			return !!(reg & AXP803_DCDC23_POLYPHASE_DUAL);
14081dbe0ccbSIcenowy Zheng 		case AXP803_DCDC6:
1409db4a555fSOlliver Schinagl 			return !!(reg & AXP803_DCDC56_POLYPHASE_DUAL);
14101dbe0ccbSIcenowy Zheng 		}
14111dbe0ccbSIcenowy Zheng 		break;
14121dbe0ccbSIcenowy Zheng 
14131dbe0ccbSIcenowy Zheng 	case AXP806_ID:
14142ca342d3SChen-Yu Tsai 		regmap_read(axp20x->regmap, AXP806_DCDC_MODE_CTRL2, &reg);
14152ca342d3SChen-Yu Tsai 
14162ca342d3SChen-Yu Tsai 		switch (id) {
14172ca342d3SChen-Yu Tsai 		case AXP806_DCDCB:
1418db4a555fSOlliver Schinagl 			return (((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
1419db4a555fSOlliver Schinagl 				AXP806_DCDCAB_POLYPHASE_DUAL) ||
1420db4a555fSOlliver Schinagl 				((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
1421db4a555fSOlliver Schinagl 				AXP806_DCDCABC_POLYPHASE_TRI));
14222ca342d3SChen-Yu Tsai 		case AXP806_DCDCC:
1423db4a555fSOlliver Schinagl 			return ((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
1424db4a555fSOlliver Schinagl 				AXP806_DCDCABC_POLYPHASE_TRI);
14252ca342d3SChen-Yu Tsai 		case AXP806_DCDCE:
1426db4a555fSOlliver Schinagl 			return !!(reg & AXP806_DCDCDE_POLYPHASE_DUAL);
14272ca342d3SChen-Yu Tsai 		}
14281dbe0ccbSIcenowy Zheng 		break;
14291dbe0ccbSIcenowy Zheng 
1430*9e72869dSShengyu Qu 	case AXP15060_ID:
1431*9e72869dSShengyu Qu 		regmap_read(axp20x->regmap, AXP15060_DCDC_MODE_CTRL1, &reg);
1432*9e72869dSShengyu Qu 
1433*9e72869dSShengyu Qu 		switch (id) {
1434*9e72869dSShengyu Qu 		case AXP15060_DCDC3:
1435*9e72869dSShengyu Qu 			return !!(reg & AXP15060_DCDC23_POLYPHASE_DUAL_MASK);
1436*9e72869dSShengyu Qu 		case AXP15060_DCDC6:
1437*9e72869dSShengyu Qu 			return !!(reg & AXP15060_DCDC46_POLYPHASE_DUAL_MASK);
1438*9e72869dSShengyu Qu 		}
1439*9e72869dSShengyu Qu 		break;
1440*9e72869dSShengyu Qu 
14411dbe0ccbSIcenowy Zheng 	default:
14421dbe0ccbSIcenowy Zheng 		return false;
14431dbe0ccbSIcenowy Zheng 	}
14442ca342d3SChen-Yu Tsai 
14452ca342d3SChen-Yu Tsai 	return false;
1446dfe7a1b0SCarlo Caione }
1447dfe7a1b0SCarlo Caione 
axp20x_regulator_probe(struct platform_device * pdev)1448dfe7a1b0SCarlo Caione static int axp20x_regulator_probe(struct platform_device *pdev)
1449dfe7a1b0SCarlo Caione {
1450dfe7a1b0SCarlo Caione 	struct regulator_dev *rdev;
1451dfe7a1b0SCarlo Caione 	struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
1452866bd951SBoris BREZILLON 	const struct regulator_desc *regulators;
1453765e8023SChen-Yu Tsai 	struct regulator_config config = {
1454765e8023SChen-Yu Tsai 		.dev = pdev->dev.parent,
1455765e8023SChen-Yu Tsai 		.regmap = axp20x->regmap,
1456866bd951SBoris BREZILLON 		.driver_data = axp20x,
1457765e8023SChen-Yu Tsai 	};
1458866bd951SBoris BREZILLON 	int ret, i, nregulators;
1459dfe7a1b0SCarlo Caione 	u32 workmode;
1460a51f9f46SChen-Yu Tsai 	const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name;
1461a51f9f46SChen-Yu Tsai 	const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name;
1462*9e72869dSShengyu Qu 	const char *aldo1_name = axp15060_regulators[AXP15060_ALDO1].name;
1463636e2a39SHans de Goede 	bool drivevbus = false;
1464dfe7a1b0SCarlo Caione 
1465866bd951SBoris BREZILLON 	switch (axp20x->variant) {
1466866bd951SBoris BREZILLON 	case AXP202_ID:
1467866bd951SBoris BREZILLON 	case AXP209_ID:
1468866bd951SBoris BREZILLON 		regulators = axp20x_regulators;
1469866bd951SBoris BREZILLON 		nregulators = AXP20X_REG_ID_MAX;
1470866bd951SBoris BREZILLON 		break;
14711b82b4e4SBoris BREZILLON 	case AXP221_ID:
147204e0981cSChen-Yu Tsai 	case AXP223_ID:
14731b82b4e4SBoris BREZILLON 		regulators = axp22x_regulators;
14741b82b4e4SBoris BREZILLON 		nregulators = AXP22X_REG_ID_MAX;
1475636e2a39SHans de Goede 		drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
1476636e2a39SHans de Goede 						  "x-powers,drive-vbus-en");
14771b82b4e4SBoris BREZILLON 		break;
147860fd7eb8SMartin Botka 	case AXP313A_ID:
147960fd7eb8SMartin Botka 		regulators = axp313a_regulators;
148060fd7eb8SMartin Botka 		nregulators = AXP313A_REG_ID_MAX;
148160fd7eb8SMartin Botka 		break;
14821dbe0ccbSIcenowy Zheng 	case AXP803_ID:
14831dbe0ccbSIcenowy Zheng 		regulators = axp803_regulators;
14841dbe0ccbSIcenowy Zheng 		nregulators = AXP803_REG_ID_MAX;
14851f5d6462SJagan Teki 		drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
14861f5d6462SJagan Teki 						  "x-powers,drive-vbus-en");
14871dbe0ccbSIcenowy Zheng 		break;
14882ca342d3SChen-Yu Tsai 	case AXP806_ID:
14892ca342d3SChen-Yu Tsai 		regulators = axp806_regulators;
14902ca342d3SChen-Yu Tsai 		nregulators = AXP806_REG_ID_MAX;
14912ca342d3SChen-Yu Tsai 		break;
1492a51f9f46SChen-Yu Tsai 	case AXP809_ID:
1493a51f9f46SChen-Yu Tsai 		regulators = axp809_regulators;
1494a51f9f46SChen-Yu Tsai 		nregulators = AXP809_REG_ID_MAX;
1495a51f9f46SChen-Yu Tsai 		break;
1496d81851c1SChen-Yu Tsai 	case AXP813_ID:
1497d81851c1SChen-Yu Tsai 		regulators = axp813_regulators;
1498d81851c1SChen-Yu Tsai 		nregulators = AXP813_REG_ID_MAX;
1499d81851c1SChen-Yu Tsai 		drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
1500d81851c1SChen-Yu Tsai 						  "x-powers,drive-vbus-en");
1501d81851c1SChen-Yu Tsai 		break;
1502*9e72869dSShengyu Qu 	case AXP15060_ID:
1503*9e72869dSShengyu Qu 		regulators = axp15060_regulators;
1504*9e72869dSShengyu Qu 		nregulators = AXP15060_REG_ID_MAX;
1505*9e72869dSShengyu Qu 		break;
1506866bd951SBoris BREZILLON 	default:
1507866bd951SBoris BREZILLON 		dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n",
1508866bd951SBoris BREZILLON 			axp20x->variant);
1509866bd951SBoris BREZILLON 		return -EINVAL;
1510866bd951SBoris BREZILLON 	}
1511866bd951SBoris BREZILLON 
1512765e8023SChen-Yu Tsai 	/* This only sets the dcdc freq. Ignore any errors */
1513765e8023SChen-Yu Tsai 	axp20x_regulator_parse_dt(pdev);
1514dfe7a1b0SCarlo Caione 
1515866bd951SBoris BREZILLON 	for (i = 0; i < nregulators; i++) {
15167118f19cSChen-Yu Tsai 		const struct regulator_desc *desc = &regulators[i];
15177118f19cSChen-Yu Tsai 		struct regulator_desc *new_desc;
15187118f19cSChen-Yu Tsai 
15197118f19cSChen-Yu Tsai 		/*
15202ca342d3SChen-Yu Tsai 		 * If this regulator is a slave in a poly-phase setup,
15212ca342d3SChen-Yu Tsai 		 * skip it, as its controls are bound to the master
15222ca342d3SChen-Yu Tsai 		 * regulator and won't work.
15232ca342d3SChen-Yu Tsai 		 */
15242ca342d3SChen-Yu Tsai 		if (axp20x_is_polyphase_slave(axp20x, i))
15252ca342d3SChen-Yu Tsai 			continue;
15262ca342d3SChen-Yu Tsai 
1527d81851c1SChen-Yu Tsai 		/* Support for AXP813's FLDO3 is not implemented */
1528d81851c1SChen-Yu Tsai 		if (axp20x->variant == AXP813_ID && i == AXP813_FLDO3)
1529d81851c1SChen-Yu Tsai 			continue;
1530d81851c1SChen-Yu Tsai 
15312ca342d3SChen-Yu Tsai 		/*
1532*9e72869dSShengyu Qu 		 * Regulators DC1SW, DC5LDO and RTCLDO on AXP15060 are
1533*9e72869dSShengyu Qu 		 * connected internally, so we have to handle their supply
1534*9e72869dSShengyu Qu 		 * names separately.
15357118f19cSChen-Yu Tsai 		 *
15367118f19cSChen-Yu Tsai 		 * We always register the regulators in proper sequence,
15377118f19cSChen-Yu Tsai 		 * so the supply names are correctly read. See the last
15387118f19cSChen-Yu Tsai 		 * part of this loop to see where we save the DT defined
15397118f19cSChen-Yu Tsai 		 * name.
15407118f19cSChen-Yu Tsai 		 */
1541a51f9f46SChen-Yu Tsai 		if ((regulators == axp22x_regulators && i == AXP22X_DC1SW) ||
15421dbe0ccbSIcenowy Zheng 		    (regulators == axp803_regulators && i == AXP803_DC1SW) ||
1543*9e72869dSShengyu Qu 		    (regulators == axp809_regulators && i == AXP809_DC1SW) ||
1544*9e72869dSShengyu Qu 		    (regulators == axp15060_regulators && i == AXP15060_SW)) {
1545a51f9f46SChen-Yu Tsai 			new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
15467118f19cSChen-Yu Tsai 						GFP_KERNEL);
1547da262968SGustavo A. R. Silva 			if (!new_desc)
1548da262968SGustavo A. R. Silva 				return -ENOMEM;
1549da262968SGustavo A. R. Silva 
15507118f19cSChen-Yu Tsai 			*new_desc = regulators[i];
1551a51f9f46SChen-Yu Tsai 			new_desc->supply_name = dcdc1_name;
15527118f19cSChen-Yu Tsai 			desc = new_desc;
15537118f19cSChen-Yu Tsai 		}
1554a51f9f46SChen-Yu Tsai 
1555a51f9f46SChen-Yu Tsai 		if ((regulators == axp22x_regulators && i == AXP22X_DC5LDO) ||
1556*9e72869dSShengyu Qu 		    (regulators == axp809_regulators && i == AXP809_DC5LDO) ||
1557*9e72869dSShengyu Qu 		    (regulators == axp15060_regulators && i == AXP15060_CPUSLDO)) {
1558a51f9f46SChen-Yu Tsai 			new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
1559a51f9f46SChen-Yu Tsai 						GFP_KERNEL);
1560da262968SGustavo A. R. Silva 			if (!new_desc)
1561da262968SGustavo A. R. Silva 				return -ENOMEM;
1562da262968SGustavo A. R. Silva 
1563a51f9f46SChen-Yu Tsai 			*new_desc = regulators[i];
1564a51f9f46SChen-Yu Tsai 			new_desc->supply_name = dcdc5_name;
1565a51f9f46SChen-Yu Tsai 			desc = new_desc;
15667118f19cSChen-Yu Tsai 		}
15677118f19cSChen-Yu Tsai 
1568*9e72869dSShengyu Qu 
1569*9e72869dSShengyu Qu 		if (regulators == axp15060_regulators && i == AXP15060_RTC_LDO) {
1570*9e72869dSShengyu Qu 			new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
1571*9e72869dSShengyu Qu 						GFP_KERNEL);
1572*9e72869dSShengyu Qu 			if (!new_desc)
1573*9e72869dSShengyu Qu 				return -ENOMEM;
1574*9e72869dSShengyu Qu 
1575*9e72869dSShengyu Qu 			*new_desc = regulators[i];
1576*9e72869dSShengyu Qu 			new_desc->supply_name = aldo1_name;
1577*9e72869dSShengyu Qu 			desc = new_desc;
1578*9e72869dSShengyu Qu 		}
1579*9e72869dSShengyu Qu 
15807118f19cSChen-Yu Tsai 		rdev = devm_regulator_register(&pdev->dev, desc, &config);
1581dfe7a1b0SCarlo Caione 		if (IS_ERR(rdev)) {
1582dfe7a1b0SCarlo Caione 			dev_err(&pdev->dev, "Failed to register %s\n",
1583866bd951SBoris BREZILLON 				regulators[i].name);
1584dfe7a1b0SCarlo Caione 
1585dfe7a1b0SCarlo Caione 			return PTR_ERR(rdev);
1586dfe7a1b0SCarlo Caione 		}
1587dfe7a1b0SCarlo Caione 
1588765e8023SChen-Yu Tsai 		ret = of_property_read_u32(rdev->dev.of_node,
1589765e8023SChen-Yu Tsai 					   "x-powers,dcdc-workmode",
1590dfe7a1b0SCarlo Caione 					   &workmode);
1591dfe7a1b0SCarlo Caione 		if (!ret) {
1592dfe7a1b0SCarlo Caione 			if (axp20x_set_dcdc_workmode(rdev, i, workmode))
1593dfe7a1b0SCarlo Caione 				dev_err(&pdev->dev, "Failed to set workmode on %s\n",
1594866bd951SBoris BREZILLON 					rdev->desc->name);
1595dfe7a1b0SCarlo Caione 		}
15967118f19cSChen-Yu Tsai 
15977118f19cSChen-Yu Tsai 		/*
1598*9e72869dSShengyu Qu 		 * Save AXP22X DCDC1 / DCDC5 / AXP15060 ALDO1 regulator names for later.
15997118f19cSChen-Yu Tsai 		 */
1600a51f9f46SChen-Yu Tsai 		if ((regulators == axp22x_regulators && i == AXP22X_DCDC1) ||
1601*9e72869dSShengyu Qu 		    (regulators == axp809_regulators && i == AXP809_DCDC1) ||
1602*9e72869dSShengyu Qu 		    (regulators == axp15060_regulators && i == AXP15060_DCDC1))
16037118f19cSChen-Yu Tsai 			of_property_read_string(rdev->dev.of_node,
16047118f19cSChen-Yu Tsai 						"regulator-name",
1605a51f9f46SChen-Yu Tsai 						&dcdc1_name);
1606a51f9f46SChen-Yu Tsai 
1607a51f9f46SChen-Yu Tsai 		if ((regulators == axp22x_regulators && i == AXP22X_DCDC5) ||
1608*9e72869dSShengyu Qu 		    (regulators == axp809_regulators && i == AXP809_DCDC5) ||
1609*9e72869dSShengyu Qu 		    (regulators == axp15060_regulators && i == AXP15060_DCDC5))
16107118f19cSChen-Yu Tsai 			of_property_read_string(rdev->dev.of_node,
16117118f19cSChen-Yu Tsai 						"regulator-name",
1612a51f9f46SChen-Yu Tsai 						&dcdc5_name);
1613*9e72869dSShengyu Qu 
1614*9e72869dSShengyu Qu 		if (regulators == axp15060_regulators && i == AXP15060_ALDO1)
1615*9e72869dSShengyu Qu 			of_property_read_string(rdev->dev.of_node,
1616*9e72869dSShengyu Qu 						"regulator-name",
1617*9e72869dSShengyu Qu 						&aldo1_name);
1618dfe7a1b0SCarlo Caione 	}
1619dfe7a1b0SCarlo Caione 
1620636e2a39SHans de Goede 	if (drivevbus) {
1621636e2a39SHans de Goede 		/* Change N_VBUSEN sense pin to DRIVEVBUS output pin */
1622636e2a39SHans de Goede 		regmap_update_bits(axp20x->regmap, AXP20X_OVER_TMP,
1623636e2a39SHans de Goede 				   AXP22X_MISC_N_VBUSEN_FUNC, 0);
1624636e2a39SHans de Goede 		rdev = devm_regulator_register(&pdev->dev,
1625636e2a39SHans de Goede 					       &axp22x_drivevbus_regulator,
1626636e2a39SHans de Goede 					       &config);
1627636e2a39SHans de Goede 		if (IS_ERR(rdev)) {
1628636e2a39SHans de Goede 			dev_err(&pdev->dev, "Failed to register drivevbus\n");
1629636e2a39SHans de Goede 			return PTR_ERR(rdev);
1630636e2a39SHans de Goede 		}
1631636e2a39SHans de Goede 	}
1632636e2a39SHans de Goede 
1633dfe7a1b0SCarlo Caione 	return 0;
1634dfe7a1b0SCarlo Caione }
1635dfe7a1b0SCarlo Caione 
1636dfe7a1b0SCarlo Caione static struct platform_driver axp20x_regulator_driver = {
1637dfe7a1b0SCarlo Caione 	.probe	= axp20x_regulator_probe,
1638dfe7a1b0SCarlo Caione 	.driver	= {
1639dfe7a1b0SCarlo Caione 		.name		= "axp20x-regulator",
1640259b93b2SDouglas Anderson 		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
1641dfe7a1b0SCarlo Caione 	},
1642dfe7a1b0SCarlo Caione };
1643dfe7a1b0SCarlo Caione 
1644dfe7a1b0SCarlo Caione module_platform_driver(axp20x_regulator_driver);
1645dfe7a1b0SCarlo Caione 
1646dfe7a1b0SCarlo Caione MODULE_LICENSE("GPL v2");
1647dfe7a1b0SCarlo Caione MODULE_AUTHOR("Carlo Caione <carlo@caione.org>");
1648dfe7a1b0SCarlo Caione MODULE_DESCRIPTION("Regulator Driver for AXP20X PMIC");
1649d4ea7d86SIan Campbell MODULE_ALIAS("platform:axp20x-regulator");
1650