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, ®);
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, ®);
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, ®);
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 = ®ulators[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