Blame view

drivers/regulator/axp20x-regulator.c 47.9 KB
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /*
   * AXP20x regulators driver.
   *
   * Copyright (C) 2013 Carlo Caione <carlo@caione.org>
   *
   * This file is subject to the terms and conditions of the GNU General
   * Public License. See the file "COPYING" in the main directory of this
   * archive for more details.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   * GNU General Public License for more details.
   */
db4a555f7   Olliver Schinagl   regulator: axp20x...
15
  #include <linux/bitops.h>
77e3e3b16   Olliver Schinagl   regulator: axp20x...
16
  #include <linux/delay.h>
dfe7a1b05   Carlo Caione   regulator: AXP20x...
17
18
  #include <linux/err.h>
  #include <linux/init.h>
db4a555f7   Olliver Schinagl   regulator: axp20x...
19
  #include <linux/mfd/axp20x.h>
dfe7a1b05   Carlo Caione   regulator: AXP20x...
20
21
22
23
24
  #include <linux/module.h>
  #include <linux/of.h>
  #include <linux/of_device.h>
  #include <linux/platform_device.h>
  #include <linux/regmap.h>
dfe7a1b05   Carlo Caione   regulator: AXP20x...
25
  #include <linux/regulator/driver.h>
77e3e3b16   Olliver Schinagl   regulator: axp20x...
26
  #include <linux/regulator/machine.h>
dfe7a1b05   Carlo Caione   regulator: AXP20x...
27
  #include <linux/regulator/of_regulator.h>
db4a555f7   Olliver Schinagl   regulator: axp20x...
28
29
  #define AXP20X_GPIO0_FUNC_MASK		GENMASK(3, 0)
  #define AXP20X_GPIO1_FUNC_MASK		GENMASK(3, 0)
dfe7a1b05   Carlo Caione   regulator: AXP20x...
30
31
  #define AXP20X_IO_ENABLED		0x03
  #define AXP20X_IO_DISABLED		0x07
db4a555f7   Olliver Schinagl   regulator: axp20x...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  #define AXP20X_WORKMODE_DCDC2_MASK	BIT_MASK(2)
  #define AXP20X_WORKMODE_DCDC3_MASK	BIT_MASK(1)
  
  #define AXP20X_FREQ_DCDC_MASK		GENMASK(3, 0)
  
  #define AXP20X_VBUS_IPSOUT_MGMT_MASK	BIT_MASK(2)
  
  #define AXP20X_DCDC2_V_OUT_MASK		GENMASK(5, 0)
  #define AXP20X_DCDC3_V_OUT_MASK		GENMASK(7, 0)
  #define AXP20X_LDO24_V_OUT_MASK		GENMASK(7, 4)
  #define AXP20X_LDO3_V_OUT_MASK		GENMASK(6, 0)
  #define AXP20X_LDO5_V_OUT_MASK		GENMASK(7, 4)
  
  #define AXP20X_PWR_OUT_EXTEN_MASK	BIT_MASK(0)
  #define AXP20X_PWR_OUT_DCDC3_MASK	BIT_MASK(1)
  #define AXP20X_PWR_OUT_LDO2_MASK	BIT_MASK(2)
  #define AXP20X_PWR_OUT_LDO4_MASK	BIT_MASK(3)
  #define AXP20X_PWR_OUT_DCDC2_MASK	BIT_MASK(4)
  #define AXP20X_PWR_OUT_LDO3_MASK	BIT_MASK(6)
d29f54df8   Olliver Schinagl   regulator: axp20x...
51
52
53
54
55
56
57
58
59
60
  #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK	BIT_MASK(0)
  #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE(x) \
  	((x) << 0)
  #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK		BIT_MASK(1)
  #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(x) \
  	((x) << 1)
  #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK		BIT_MASK(2)
  #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN		BIT(2)
  #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK		BIT_MASK(3)
  #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN		BIT(3)
db4a555f7   Olliver Schinagl   regulator: axp20x...
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  #define AXP20X_LDO4_V_OUT_1250mV_START	0x0
  #define AXP20X_LDO4_V_OUT_1250mV_STEPS	0
  #define AXP20X_LDO4_V_OUT_1250mV_END	\
  	(AXP20X_LDO4_V_OUT_1250mV_START + AXP20X_LDO4_V_OUT_1250mV_STEPS)
  #define AXP20X_LDO4_V_OUT_1300mV_START	0x1
  #define AXP20X_LDO4_V_OUT_1300mV_STEPS	7
  #define AXP20X_LDO4_V_OUT_1300mV_END	\
  	(AXP20X_LDO4_V_OUT_1300mV_START + AXP20X_LDO4_V_OUT_1300mV_STEPS)
  #define AXP20X_LDO4_V_OUT_2500mV_START	0x9
  #define AXP20X_LDO4_V_OUT_2500mV_STEPS	0
  #define AXP20X_LDO4_V_OUT_2500mV_END	\
  	(AXP20X_LDO4_V_OUT_2500mV_START + AXP20X_LDO4_V_OUT_2500mV_STEPS)
  #define AXP20X_LDO4_V_OUT_2700mV_START	0xa
  #define AXP20X_LDO4_V_OUT_2700mV_STEPS	1
  #define AXP20X_LDO4_V_OUT_2700mV_END	\
  	(AXP20X_LDO4_V_OUT_2700mV_START + AXP20X_LDO4_V_OUT_2700mV_STEPS)
  #define AXP20X_LDO4_V_OUT_3000mV_START	0xc
  #define AXP20X_LDO4_V_OUT_3000mV_STEPS	3
  #define AXP20X_LDO4_V_OUT_3000mV_END	\
  	(AXP20X_LDO4_V_OUT_3000mV_START + AXP20X_LDO4_V_OUT_3000mV_STEPS)
  #define AXP20X_LDO4_V_OUT_NUM_VOLTAGES	16
3cb99e2ea   Chen-Yu Tsai   regulator: axp20x...
82
83
  #define AXP22X_IO_ENABLED		0x03
  #define AXP22X_IO_DISABLED		0x04
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
84

db4a555f7   Olliver Schinagl   regulator: axp20x...
85
  #define AXP22X_WORKMODE_DCDCX_MASK(x)	BIT_MASK(x)
dfe7a1b05   Carlo Caione   regulator: AXP20x...
86

636e2a39c   Hans de Goede   regulator: axp20x...
87
  #define AXP22X_MISC_N_VBUSEN_FUNC	BIT(4)
db4a555f7   Olliver Schinagl   regulator: axp20x...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  #define AXP22X_DCDC1_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_DCDC2_V_OUT_MASK		GENMASK(5, 0)
  #define AXP22X_DCDC3_V_OUT_MASK		GENMASK(5, 0)
  #define AXP22X_DCDC4_V_OUT_MASK		GENMASK(5, 0)
  #define AXP22X_DCDC5_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_DC5LDO_V_OUT_MASK	GENMASK(2, 0)
  #define AXP22X_ALDO1_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_ALDO2_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_ALDO3_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_DLDO1_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_DLDO2_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_DLDO3_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_DLDO4_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_ELDO1_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_ELDO2_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_ELDO3_V_OUT_MASK		GENMASK(4, 0)
  #define AXP22X_LDO_IO0_V_OUT_MASK	GENMASK(4, 0)
  #define AXP22X_LDO_IO1_V_OUT_MASK	GENMASK(4, 0)
  
  #define AXP22X_PWR_OUT_DC5LDO_MASK	BIT_MASK(0)
  #define AXP22X_PWR_OUT_DCDC1_MASK	BIT_MASK(1)
  #define AXP22X_PWR_OUT_DCDC2_MASK	BIT_MASK(2)
  #define AXP22X_PWR_OUT_DCDC3_MASK	BIT_MASK(3)
  #define AXP22X_PWR_OUT_DCDC4_MASK	BIT_MASK(4)
  #define AXP22X_PWR_OUT_DCDC5_MASK	BIT_MASK(5)
  #define AXP22X_PWR_OUT_ALDO1_MASK	BIT_MASK(6)
  #define AXP22X_PWR_OUT_ALDO2_MASK	BIT_MASK(7)
  
  #define AXP22X_PWR_OUT_SW_MASK		BIT_MASK(6)
  #define AXP22X_PWR_OUT_DC1SW_MASK	BIT_MASK(7)
  
  #define AXP22X_PWR_OUT_ELDO1_MASK	BIT_MASK(0)
  #define AXP22X_PWR_OUT_ELDO2_MASK	BIT_MASK(1)
  #define AXP22X_PWR_OUT_ELDO3_MASK	BIT_MASK(2)
  #define AXP22X_PWR_OUT_DLDO1_MASK	BIT_MASK(3)
  #define AXP22X_PWR_OUT_DLDO2_MASK	BIT_MASK(4)
  #define AXP22X_PWR_OUT_DLDO3_MASK	BIT_MASK(5)
  #define AXP22X_PWR_OUT_DLDO4_MASK	BIT_MASK(6)
  #define AXP22X_PWR_OUT_ALDO3_MASK	BIT_MASK(7)
  
  #define AXP803_PWR_OUT_DCDC1_MASK	BIT_MASK(0)
  #define AXP803_PWR_OUT_DCDC2_MASK	BIT_MASK(1)
  #define AXP803_PWR_OUT_DCDC3_MASK	BIT_MASK(2)
  #define AXP803_PWR_OUT_DCDC4_MASK	BIT_MASK(3)
  #define AXP803_PWR_OUT_DCDC5_MASK	BIT_MASK(4)
  #define AXP803_PWR_OUT_DCDC6_MASK	BIT_MASK(5)
  
  #define AXP803_PWR_OUT_FLDO1_MASK	BIT_MASK(2)
  #define AXP803_PWR_OUT_FLDO2_MASK	BIT_MASK(3)
  
  #define AXP803_DCDC1_V_OUT_MASK		GENMASK(4, 0)
  #define AXP803_DCDC2_V_OUT_MASK		GENMASK(6, 0)
  #define AXP803_DCDC3_V_OUT_MASK		GENMASK(6, 0)
  #define AXP803_DCDC4_V_OUT_MASK		GENMASK(6, 0)
  #define AXP803_DCDC5_V_OUT_MASK		GENMASK(6, 0)
  #define AXP803_DCDC6_V_OUT_MASK		GENMASK(6, 0)
  
  #define AXP803_FLDO1_V_OUT_MASK		GENMASK(3, 0)
  #define AXP803_FLDO2_V_OUT_MASK		GENMASK(3, 0)
  
  #define AXP803_DCDC23_POLYPHASE_DUAL	BIT(6)
  #define AXP803_DCDC56_POLYPHASE_DUAL	BIT(5)
  
  #define AXP803_DCDC234_500mV_START	0x00
  #define AXP803_DCDC234_500mV_STEPS	70
  #define AXP803_DCDC234_500mV_END	\
  	(AXP803_DCDC234_500mV_START + AXP803_DCDC234_500mV_STEPS)
  #define AXP803_DCDC234_1220mV_START	0x47
  #define AXP803_DCDC234_1220mV_STEPS	4
  #define AXP803_DCDC234_1220mV_END	\
  	(AXP803_DCDC234_1220mV_START + AXP803_DCDC234_1220mV_STEPS)
  #define AXP803_DCDC234_NUM_VOLTAGES	76
  
  #define AXP803_DCDC5_800mV_START	0x00
  #define AXP803_DCDC5_800mV_STEPS	32
  #define AXP803_DCDC5_800mV_END		\
  	(AXP803_DCDC5_800mV_START + AXP803_DCDC5_800mV_STEPS)
  #define AXP803_DCDC5_1140mV_START	0x21
  #define AXP803_DCDC5_1140mV_STEPS	35
  #define AXP803_DCDC5_1140mV_END		\
  	(AXP803_DCDC5_1140mV_START + AXP803_DCDC5_1140mV_STEPS)
8f46e22b5   Jernej Skrabec   regulator: axp20x...
169
  #define AXP803_DCDC5_NUM_VOLTAGES	69
db4a555f7   Olliver Schinagl   regulator: axp20x...
170
171
172
173
174
175
  
  #define AXP803_DCDC6_600mV_START	0x00
  #define AXP803_DCDC6_600mV_STEPS	50
  #define AXP803_DCDC6_600mV_END		\
  	(AXP803_DCDC6_600mV_START + AXP803_DCDC6_600mV_STEPS)
  #define AXP803_DCDC6_1120mV_START	0x33
8f46e22b5   Jernej Skrabec   regulator: axp20x...
176
  #define AXP803_DCDC6_1120mV_STEPS	20
db4a555f7   Olliver Schinagl   regulator: axp20x...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
  #define AXP803_DCDC6_1120mV_END		\
  	(AXP803_DCDC6_1120mV_START + AXP803_DCDC6_1120mV_STEPS)
  #define AXP803_DCDC6_NUM_VOLTAGES	72
  
  #define AXP803_DLDO2_700mV_START	0x00
  #define AXP803_DLDO2_700mV_STEPS	26
  #define AXP803_DLDO2_700mV_END		\
  	(AXP803_DLDO2_700mV_START + AXP803_DLDO2_700mV_STEPS)
  #define AXP803_DLDO2_3400mV_START	0x1b
  #define AXP803_DLDO2_3400mV_STEPS	4
  #define AXP803_DLDO2_3400mV_END		\
  	(AXP803_DLDO2_3400mV_START + AXP803_DLDO2_3400mV_STEPS)
  #define AXP803_DLDO2_NUM_VOLTAGES	32
  
  #define AXP806_DCDCA_V_CTRL_MASK	GENMASK(6, 0)
  #define AXP806_DCDCB_V_CTRL_MASK	GENMASK(4, 0)
  #define AXP806_DCDCC_V_CTRL_MASK	GENMASK(6, 0)
  #define AXP806_DCDCD_V_CTRL_MASK	GENMASK(5, 0)
  #define AXP806_DCDCE_V_CTRL_MASK	GENMASK(4, 0)
  #define AXP806_ALDO1_V_CTRL_MASK	GENMASK(4, 0)
  #define AXP806_ALDO2_V_CTRL_MASK	GENMASK(4, 0)
  #define AXP806_ALDO3_V_CTRL_MASK	GENMASK(4, 0)
  #define AXP806_BLDO1_V_CTRL_MASK	GENMASK(3, 0)
  #define AXP806_BLDO2_V_CTRL_MASK	GENMASK(3, 0)
  #define AXP806_BLDO3_V_CTRL_MASK	GENMASK(3, 0)
  #define AXP806_BLDO4_V_CTRL_MASK	GENMASK(3, 0)
  #define AXP806_CLDO1_V_CTRL_MASK	GENMASK(4, 0)
  #define AXP806_CLDO2_V_CTRL_MASK	GENMASK(4, 0)
  #define AXP806_CLDO3_V_CTRL_MASK	GENMASK(4, 0)
  
  #define AXP806_PWR_OUT_DCDCA_MASK	BIT_MASK(0)
  #define AXP806_PWR_OUT_DCDCB_MASK	BIT_MASK(1)
  #define AXP806_PWR_OUT_DCDCC_MASK	BIT_MASK(2)
  #define AXP806_PWR_OUT_DCDCD_MASK	BIT_MASK(3)
  #define AXP806_PWR_OUT_DCDCE_MASK	BIT_MASK(4)
  #define AXP806_PWR_OUT_ALDO1_MASK	BIT_MASK(5)
  #define AXP806_PWR_OUT_ALDO2_MASK	BIT_MASK(6)
  #define AXP806_PWR_OUT_ALDO3_MASK	BIT_MASK(7)
  #define AXP806_PWR_OUT_BLDO1_MASK	BIT_MASK(0)
  #define AXP806_PWR_OUT_BLDO2_MASK	BIT_MASK(1)
  #define AXP806_PWR_OUT_BLDO3_MASK	BIT_MASK(2)
  #define AXP806_PWR_OUT_BLDO4_MASK	BIT_MASK(3)
  #define AXP806_PWR_OUT_CLDO1_MASK	BIT_MASK(4)
  #define AXP806_PWR_OUT_CLDO2_MASK	BIT_MASK(5)
  #define AXP806_PWR_OUT_CLDO3_MASK	BIT_MASK(6)
  #define AXP806_PWR_OUT_SW_MASK		BIT_MASK(7)
  
  #define AXP806_DCDCAB_POLYPHASE_DUAL	0x40
  #define AXP806_DCDCABC_POLYPHASE_TRI	0x80
  #define AXP806_DCDCABC_POLYPHASE_MASK	GENMASK(7, 6)
  
  #define AXP806_DCDCDE_POLYPHASE_DUAL	BIT(5)
  
  #define AXP806_DCDCA_600mV_START	0x00
  #define AXP806_DCDCA_600mV_STEPS	50
  #define AXP806_DCDCA_600mV_END		\
  	(AXP806_DCDCA_600mV_START + AXP806_DCDCA_600mV_STEPS)
  #define AXP806_DCDCA_1120mV_START	0x33
1ef55fed9   Jernej Skrabec   regulator: axp20x...
235
  #define AXP806_DCDCA_1120mV_STEPS	20
db4a555f7   Olliver Schinagl   regulator: axp20x...
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
  #define AXP806_DCDCA_1120mV_END		\
  	(AXP806_DCDCA_1120mV_START + AXP806_DCDCA_1120mV_STEPS)
  #define AXP806_DCDCA_NUM_VOLTAGES	72
  
  #define AXP806_DCDCD_600mV_START	0x00
  #define AXP806_DCDCD_600mV_STEPS	45
  #define AXP806_DCDCD_600mV_END		\
  	(AXP806_DCDCD_600mV_START + AXP806_DCDCD_600mV_STEPS)
  #define AXP806_DCDCD_1600mV_START	0x2e
  #define AXP806_DCDCD_1600mV_STEPS	17
  #define AXP806_DCDCD_1600mV_END		\
  	(AXP806_DCDCD_1600mV_START + AXP806_DCDCD_1600mV_STEPS)
  #define AXP806_DCDCD_NUM_VOLTAGES	64
  
  #define AXP809_DCDC4_600mV_START	0x00
  #define AXP809_DCDC4_600mV_STEPS	47
  #define AXP809_DCDC4_600mV_END		\
  	(AXP809_DCDC4_600mV_START + AXP809_DCDC4_600mV_STEPS)
  #define AXP809_DCDC4_1800mV_START	0x30
  #define AXP809_DCDC4_1800mV_STEPS	8
  #define AXP809_DCDC4_1800mV_END		\
  	(AXP809_DCDC4_1800mV_START + AXP809_DCDC4_1800mV_STEPS)
  #define AXP809_DCDC4_NUM_VOLTAGES	57
  
  #define AXP813_DCDC7_V_OUT_MASK		GENMASK(6, 0)
  
  #define AXP813_PWR_OUT_DCDC7_MASK	BIT_MASK(6)
866bd951f   Boris BREZILLON   regulator: axp20x...
263
264
265
  #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\
  		    _vmask, _ereg, _emask, _enable_val, _disable_val)		\
  	[_family##_##_id] = {							\
e0bbb38c2   Chen-Yu Tsai   regulator: axp20x...
266
  		.name		= (_match),					\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
267
  		.supply_name	= (_supply),					\
880fe82dc   Chen-Yu Tsai   regulator: axp20x...
268
269
  		.of_match	= of_match_ptr(_match),				\
  		.regulators_node = of_match_ptr("regulators"),			\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
270
  		.type		= REGULATOR_VOLTAGE,				\
866bd951f   Boris BREZILLON   regulator: axp20x...
271
  		.id		= _family##_##_id,				\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
272
273
274
275
276
277
278
279
280
281
282
283
  		.n_voltages	= (((_max) - (_min)) / (_step) + 1),		\
  		.owner		= THIS_MODULE,					\
  		.min_uV		= (_min) * 1000,				\
  		.uV_step	= (_step) * 1000,				\
  		.vsel_reg	= (_vreg),					\
  		.vsel_mask	= (_vmask),					\
  		.enable_reg	= (_ereg),					\
  		.enable_mask	= (_emask),					\
  		.enable_val	= (_enable_val),				\
  		.disable_val	= (_disable_val),				\
  		.ops		= &axp20x_ops,					\
  	}
866bd951f   Boris BREZILLON   regulator: axp20x...
284
285
286
  #define AXP_DESC(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\
  		 _vmask, _ereg, _emask) 					\
  	[_family##_##_id] = {							\
e0bbb38c2   Chen-Yu Tsai   regulator: axp20x...
287
  		.name		= (_match),					\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
288
  		.supply_name	= (_supply),					\
880fe82dc   Chen-Yu Tsai   regulator: axp20x...
289
290
  		.of_match	= of_match_ptr(_match),				\
  		.regulators_node = of_match_ptr("regulators"),			\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
291
  		.type		= REGULATOR_VOLTAGE,				\
866bd951f   Boris BREZILLON   regulator: axp20x...
292
  		.id		= _family##_##_id,				\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
293
294
295
296
297
298
299
300
301
302
  		.n_voltages	= (((_max) - (_min)) / (_step) + 1),		\
  		.owner		= THIS_MODULE,					\
  		.min_uV		= (_min) * 1000,				\
  		.uV_step	= (_step) * 1000,				\
  		.vsel_reg	= (_vreg),					\
  		.vsel_mask	= (_vmask),					\
  		.enable_reg	= (_ereg),					\
  		.enable_mask	= (_emask),					\
  		.ops		= &axp20x_ops,					\
  	}
94c39041a   Chen-Yu Tsai   regulator: axp20x...
303
  #define AXP_DESC_SW(_family, _id, _match, _supply, _ereg, _emask)		\
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
304
  	[_family##_##_id] = {							\
e0bbb38c2   Chen-Yu Tsai   regulator: axp20x...
305
  		.name		= (_match),					\
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
306
307
308
309
310
  		.supply_name	= (_supply),					\
  		.of_match	= of_match_ptr(_match),				\
  		.regulators_node = of_match_ptr("regulators"),			\
  		.type		= REGULATOR_VOLTAGE,				\
  		.id		= _family##_##_id,				\
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
311
  		.owner		= THIS_MODULE,					\
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
312
313
314
315
  		.enable_reg	= (_ereg),					\
  		.enable_mask	= (_emask),					\
  		.ops		= &axp20x_ops_sw,				\
  	}
866bd951f   Boris BREZILLON   regulator: axp20x...
316
317
  #define AXP_DESC_FIXED(_family, _id, _match, _supply, _volt)			\
  	[_family##_##_id] = {							\
e0bbb38c2   Chen-Yu Tsai   regulator: axp20x...
318
  		.name		= (_match),					\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
319
  		.supply_name	= (_supply),					\
880fe82dc   Chen-Yu Tsai   regulator: axp20x...
320
321
  		.of_match	= of_match_ptr(_match),				\
  		.regulators_node = of_match_ptr("regulators"),			\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
322
  		.type		= REGULATOR_VOLTAGE,				\
866bd951f   Boris BREZILLON   regulator: axp20x...
323
  		.id		= _family##_##_id,				\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
324
325
326
327
328
  		.n_voltages	= 1,						\
  		.owner		= THIS_MODULE,					\
  		.min_uV		= (_volt) * 1000,				\
  		.ops		= &axp20x_ops_fixed				\
  	}
13d57e643   Chen-Yu Tsai   regulator: axp20x...
329
330
  #define AXP_DESC_RANGES(_family, _id, _match, _supply, _ranges, _n_voltages,	\
  			_vreg, _vmask, _ereg, _emask)				\
866bd951f   Boris BREZILLON   regulator: axp20x...
331
  	[_family##_##_id] = {							\
e0bbb38c2   Chen-Yu Tsai   regulator: axp20x...
332
  		.name		= (_match),					\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
333
  		.supply_name	= (_supply),					\
880fe82dc   Chen-Yu Tsai   regulator: axp20x...
334
335
  		.of_match	= of_match_ptr(_match),				\
  		.regulators_node = of_match_ptr("regulators"),			\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
336
  		.type		= REGULATOR_VOLTAGE,				\
866bd951f   Boris BREZILLON   regulator: axp20x...
337
  		.id		= _family##_##_id,				\
13d57e643   Chen-Yu Tsai   regulator: axp20x...
338
  		.n_voltages	= (_n_voltages),				\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
339
340
341
342
343
  		.owner		= THIS_MODULE,					\
  		.vsel_reg	= (_vreg),					\
  		.vsel_mask	= (_vmask),					\
  		.enable_reg	= (_ereg),					\
  		.enable_mask	= (_emask),					\
13d57e643   Chen-Yu Tsai   regulator: axp20x...
344
345
346
  		.linear_ranges	= (_ranges),					\
  		.n_linear_ranges = ARRAY_SIZE(_ranges),				\
  		.ops		= &axp20x_ops_range,				\
dfe7a1b05   Carlo Caione   regulator: AXP20x...
347
  	}
d29f54df8   Olliver Schinagl   regulator: axp20x...
348
349
350
351
352
353
354
355
  static const int axp209_dcdc2_ldo3_slew_rates[] = {
  	1600,
  	 800,
  };
  
  static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp)
  {
  	struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
04d1446bc   Axel Lin   regulator: axp20x...
356
  	int id = rdev_get_id(rdev);
d29f54df8   Olliver Schinagl   regulator: axp20x...
357
358
359
  	u8 reg, mask, enable, cfg = 0xff;
  	const int *slew_rates;
  	int rate_count = 0;
d29f54df8   Olliver Schinagl   regulator: axp20x...
360
361
  	switch (axp20x->variant) {
  	case AXP209_ID:
04d1446bc   Axel Lin   regulator: axp20x...
362
  		if (id == AXP20X_DCDC2) {
918446c96   Priit Laes   regulator: axp20x...
363
  			slew_rates = axp209_dcdc2_ldo3_slew_rates;
d29f54df8   Olliver Schinagl   regulator: axp20x...
364
365
366
367
368
369
370
371
372
  			rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates);
  			reg = AXP20X_DCDC2_LDO3_V_RAMP;
  			mask = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK |
  			       AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK;
  			enable = (ramp > 0) ?
  				 AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN :
  				 !AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN;
  			break;
  		}
04d1446bc   Axel Lin   regulator: axp20x...
373
  		if (id == AXP20X_LDO3) {
d29f54df8   Olliver Schinagl   regulator: axp20x...
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
  			slew_rates = axp209_dcdc2_ldo3_slew_rates;
  			rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates);
  			reg = AXP20X_DCDC2_LDO3_V_RAMP;
  			mask = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK |
  			       AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK;
  			enable = (ramp > 0) ?
  				 AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN :
  				 !AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN;
  			break;
  		}
  
  		if (rate_count > 0)
  			break;
  
  		/* fall through */
  	default:
  		/* Not supported for this regulator */
  		return -ENOTSUPP;
  	}
  
  	if (ramp == 0) {
  		cfg = enable;
  	} else {
  		int i;
  
  		for (i = 0; i < rate_count; i++) {
71dd2fe5d   Axel Lin   regulator: axp20x...
400
  			if (ramp > slew_rates[i])
d29f54df8   Olliver Schinagl   regulator: axp20x...
401
  				break;
71dd2fe5d   Axel Lin   regulator: axp20x...
402
403
404
405
406
  
  			if (id == AXP20X_DCDC2)
  				cfg = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE(i);
  			else
  				cfg = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(i);
d29f54df8   Olliver Schinagl   regulator: axp20x...
407
408
409
410
411
412
413
414
415
416
417
418
  		}
  
  		if (cfg == 0xff) {
  			dev_err(axp20x->dev, "unsupported ramp value %d", ramp);
  			return -EINVAL;
  		}
  
  		cfg |= enable;
  	}
  
  	return regmap_update_bits(axp20x->regmap, reg, mask, cfg);
  }
77e3e3b16   Olliver Schinagl   regulator: axp20x...
419
420
421
  static int axp20x_regulator_enable_regmap(struct regulator_dev *rdev)
  {
  	struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
04d1446bc   Axel Lin   regulator: axp20x...
422
  	int id = rdev_get_id(rdev);
6f3656f35   Colin Ian King   regulator: axp20x...
423

77e3e3b16   Olliver Schinagl   regulator: axp20x...
424
425
  	switch (axp20x->variant) {
  	case AXP209_ID:
04d1446bc   Axel Lin   regulator: axp20x...
426
  		if ((id == AXP20X_LDO3) &&
77e3e3b16   Olliver Schinagl   regulator: axp20x...
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
  		    rdev->constraints && rdev->constraints->soft_start) {
  			int v_out;
  			int ret;
  
  			/*
  			 * On some boards, the LDO3 can be overloaded when
  			 * turning on, causing the entire PMIC to shutdown
  			 * without warning. Turning it on at the minimal voltage
  			 * and then setting the voltage to the requested value
  			 * works reliably.
  			 */
  			if (regulator_is_enabled_regmap(rdev))
  				break;
  
  			v_out = regulator_get_voltage_sel_regmap(rdev);
  			if (v_out < 0)
  				return v_out;
  
  			if (v_out == 0)
  				break;
  
  			ret = regulator_set_voltage_sel_regmap(rdev, 0x00);
  			/*
  			 * A small pause is needed between
  			 * setting the voltage and enabling the LDO to give the
  			 * internal state machine time to process the request.
  			 */
  			usleep_range(1000, 5000);
  			ret |= regulator_enable_regmap(rdev);
  			ret |= regulator_set_voltage_sel_regmap(rdev, v_out);
  
  			return ret;
  		}
  		break;
  	default:
  		/* No quirks */
  		break;
  	}
  
  	return regulator_enable_regmap(rdev);
  };
ef306e44c   Bhumika Goyal   regulator: axp20x...
468
  static const struct regulator_ops axp20x_ops_fixed = {
dfe7a1b05   Carlo Caione   regulator: AXP20x...
469
470
  	.list_voltage		= regulator_list_voltage_linear,
  };
ef306e44c   Bhumika Goyal   regulator: axp20x...
471
  static const struct regulator_ops axp20x_ops_range = {
dfe7a1b05   Carlo Caione   regulator: AXP20x...
472
473
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
13d57e643   Chen-Yu Tsai   regulator: axp20x...
474
  	.list_voltage		= regulator_list_voltage_linear_range,
dfe7a1b05   Carlo Caione   regulator: AXP20x...
475
476
477
478
  	.enable			= regulator_enable_regmap,
  	.disable		= regulator_disable_regmap,
  	.is_enabled		= regulator_is_enabled_regmap,
  };
ef306e44c   Bhumika Goyal   regulator: axp20x...
479
  static const struct regulator_ops axp20x_ops = {
dfe7a1b05   Carlo Caione   regulator: AXP20x...
480
481
482
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.list_voltage		= regulator_list_voltage_linear,
77e3e3b16   Olliver Schinagl   regulator: axp20x...
483
  	.enable			= axp20x_regulator_enable_regmap,
dfe7a1b05   Carlo Caione   regulator: AXP20x...
484
485
  	.disable		= regulator_disable_regmap,
  	.is_enabled		= regulator_is_enabled_regmap,
d29f54df8   Olliver Schinagl   regulator: axp20x...
486
  	.set_ramp_delay		= axp20x_set_ramp_delay,
dfe7a1b05   Carlo Caione   regulator: AXP20x...
487
  };
ef306e44c   Bhumika Goyal   regulator: axp20x...
488
  static const struct regulator_ops axp20x_ops_sw = {
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
489
490
491
492
  	.enable			= regulator_enable_regmap,
  	.disable		= regulator_disable_regmap,
  	.is_enabled		= regulator_is_enabled_regmap,
  };
13d57e643   Chen-Yu Tsai   regulator: axp20x...
493
  static const struct regulator_linear_range axp20x_ldo4_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
  	REGULATOR_LINEAR_RANGE(1250000,
  			       AXP20X_LDO4_V_OUT_1250mV_START,
  			       AXP20X_LDO4_V_OUT_1250mV_END,
  			       0),
  	REGULATOR_LINEAR_RANGE(1300000,
  			       AXP20X_LDO4_V_OUT_1300mV_START,
  			       AXP20X_LDO4_V_OUT_1300mV_END,
  			       100000),
  	REGULATOR_LINEAR_RANGE(2500000,
  			       AXP20X_LDO4_V_OUT_2500mV_START,
  			       AXP20X_LDO4_V_OUT_2500mV_END,
  			       0),
  	REGULATOR_LINEAR_RANGE(2700000,
  			       AXP20X_LDO4_V_OUT_2700mV_START,
  			       AXP20X_LDO4_V_OUT_2700mV_END,
  			       100000),
  	REGULATOR_LINEAR_RANGE(3000000,
  			       AXP20X_LDO4_V_OUT_3000mV_START,
  			       AXP20X_LDO4_V_OUT_3000mV_END,
  			       100000),
13d57e643   Chen-Yu Tsai   regulator: axp20x...
514
  };
dfe7a1b05   Carlo Caione   regulator: AXP20x...
515
  static const struct regulator_desc axp20x_regulators[] = {
866bd951f   Boris BREZILLON   regulator: axp20x...
516
  	AXP_DESC(AXP20X, DCDC2, "dcdc2", "vin2", 700, 2275, 25,
db4a555f7   Olliver Schinagl   regulator: axp20x...
517
518
  		 AXP20X_DCDC2_V_OUT, AXP20X_DCDC2_V_OUT_MASK,
  		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_DCDC2_MASK),
866bd951f   Boris BREZILLON   regulator: axp20x...
519
  	AXP_DESC(AXP20X, DCDC3, "dcdc3", "vin3", 700, 3500, 25,
db4a555f7   Olliver Schinagl   regulator: axp20x...
520
521
  		 AXP20X_DCDC3_V_OUT, AXP20X_DCDC3_V_OUT_MASK,
  		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_DCDC3_MASK),
866bd951f   Boris BREZILLON   regulator: axp20x...
522
523
  	AXP_DESC_FIXED(AXP20X, LDO1, "ldo1", "acin", 1300),
  	AXP_DESC(AXP20X, LDO2, "ldo2", "ldo24in", 1800, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
524
525
  		 AXP20X_LDO24_V_OUT, AXP20X_LDO24_V_OUT_MASK,
  		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO2_MASK),
866bd951f   Boris BREZILLON   regulator: axp20x...
526
  	AXP_DESC(AXP20X, LDO3, "ldo3", "ldo3in", 700, 3500, 25,
db4a555f7   Olliver Schinagl   regulator: axp20x...
527
528
529
530
531
532
  		 AXP20X_LDO3_V_OUT, AXP20X_LDO3_V_OUT_MASK,
  		 AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO3_MASK),
  	AXP_DESC_RANGES(AXP20X, LDO4, "ldo4", "ldo24in",
  			axp20x_ldo4_ranges, AXP20X_LDO4_V_OUT_NUM_VOLTAGES,
  			AXP20X_LDO24_V_OUT, AXP20X_LDO24_V_OUT_MASK,
  			AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO4_MASK),
866bd951f   Boris BREZILLON   regulator: axp20x...
533
  	AXP_DESC_IO(AXP20X, LDO5, "ldo5", "ldo5in", 1800, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
534
535
  		    AXP20X_LDO5_V_OUT, AXP20X_LDO5_V_OUT_MASK,
  		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
866bd951f   Boris BREZILLON   regulator: axp20x...
536
  		    AXP20X_IO_ENABLED, AXP20X_IO_DISABLED),
dfe7a1b05   Carlo Caione   regulator: AXP20x...
537
  };
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
538
539
  static const struct regulator_desc axp22x_regulators[] = {
  	AXP_DESC(AXP22X, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
540
541
  		 AXP22X_DCDC1_V_OUT, AXP22X_DCDC1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC1_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
542
  	AXP_DESC(AXP22X, DCDC2, "dcdc2", "vin2", 600, 1540, 20,
db4a555f7   Olliver Schinagl   regulator: axp20x...
543
544
  		 AXP22X_DCDC2_V_OUT, AXP22X_DCDC2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC2_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
545
  	AXP_DESC(AXP22X, DCDC3, "dcdc3", "vin3", 600, 1860, 20,
db4a555f7   Olliver Schinagl   regulator: axp20x...
546
547
  		 AXP22X_DCDC3_V_OUT, AXP22X_DCDC3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC3_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
548
  	AXP_DESC(AXP22X, DCDC4, "dcdc4", "vin4", 600, 1540, 20,
d02337709   Axel Lin   regulator: axp20x...
549
  		 AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
550
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC4_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
551
  	AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
552
553
  		 AXP22X_DCDC5_V_OUT, AXP22X_DCDC5_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC5_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
554
  	/* secondary switchable output of DCDC1 */
db4a555f7   Olliver Schinagl   regulator: axp20x...
555
556
  	AXP_DESC_SW(AXP22X, DC1SW, "dc1sw", NULL,
  		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
557
  	/* LDO regulator internally chained to DCDC5 */
7118f19c4   Chen-Yu Tsai   regulator: axp20x...
558
  	AXP_DESC(AXP22X, DC5LDO, "dc5ldo", NULL, 700, 1400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
559
560
  		 AXP22X_DC5LDO_V_OUT, AXP22X_DC5LDO_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DC5LDO_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
561
  	AXP_DESC(AXP22X, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
562
563
  		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO1_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
564
  	AXP_DESC(AXP22X, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
565
566
  		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO2_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
567
  	AXP_DESC(AXP22X, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
568
569
  		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP22X_PWR_OUT_ALDO3_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
570
  	AXP_DESC(AXP22X, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
571
572
  		 AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
573
  	AXP_DESC(AXP22X, DLDO2, "dldo2", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
574
575
  		 AXP22X_DLDO2_V_OUT, AXP22X_PWR_OUT_DLDO2_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
576
  	AXP_DESC(AXP22X, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
577
578
  		 AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
579
  	AXP_DESC(AXP22X, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
580
581
  		 AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
582
  	AXP_DESC(AXP22X, ELDO1, "eldo1", "eldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
583
584
  		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
585
  	AXP_DESC(AXP22X, ELDO2, "eldo2", "eldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
586
  		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
f40ddaa05   Chen-Yu Tsai   regulator: axp20x...
587
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
588
  	AXP_DESC(AXP22X, ELDO3, "eldo3", "eldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
589
590
  		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
f40d4896b   Hans de Goede   regulator: axp20x...
591
592
593
  	/* Note the datasheet only guarantees reliable operation up to
  	 * 3.3V, this needs to be enforced via dts provided constraints */
  	AXP_DESC_IO(AXP22X, LDO_IO0, "ldo_io0", "ips", 700, 3800, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
594
595
  		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
596
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
f40d4896b   Hans de Goede   regulator: axp20x...
597
598
599
  	/* Note the datasheet only guarantees reliable operation up to
  	 * 3.3V, this needs to be enforced via dts provided constraints */
  	AXP_DESC_IO(AXP22X, LDO_IO1, "ldo_io1", "ips", 700, 3800, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
600
601
  		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
602
603
604
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  	AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000),
  };
636e2a39c   Hans de Goede   regulator: axp20x...
605
606
607
608
609
610
611
612
  static const struct regulator_desc axp22x_drivevbus_regulator = {
  	.name		= "drivevbus",
  	.supply_name	= "drivevbus",
  	.of_match	= of_match_ptr("drivevbus"),
  	.regulators_node = of_match_ptr("regulators"),
  	.type		= REGULATOR_VOLTAGE,
  	.owner		= THIS_MODULE,
  	.enable_reg	= AXP20X_VBUS_IPSOUT_MGMT,
db4a555f7   Olliver Schinagl   regulator: axp20x...
613
  	.enable_mask	= AXP20X_VBUS_IPSOUT_MGMT_MASK,
636e2a39c   Hans de Goede   regulator: axp20x...
614
615
  	.ops		= &axp20x_ops_sw,
  };
d81851c17   Chen-Yu Tsai   regulator: axp20x...
616
  /* DCDC ranges shared with AXP813 */
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
617
  static const struct regulator_linear_range axp803_dcdc234_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
618
619
620
621
622
623
624
625
  	REGULATOR_LINEAR_RANGE(500000,
  			       AXP803_DCDC234_500mV_START,
  			       AXP803_DCDC234_500mV_END,
  			       10000),
  	REGULATOR_LINEAR_RANGE(1220000,
  			       AXP803_DCDC234_1220mV_START,
  			       AXP803_DCDC234_1220mV_END,
  			       20000),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
626
627
628
  };
  
  static const struct regulator_linear_range axp803_dcdc5_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
629
630
631
632
633
634
635
636
  	REGULATOR_LINEAR_RANGE(800000,
  			       AXP803_DCDC5_800mV_START,
  			       AXP803_DCDC5_800mV_END,
  			       10000),
  	REGULATOR_LINEAR_RANGE(1140000,
  			       AXP803_DCDC5_1140mV_START,
  			       AXP803_DCDC5_1140mV_END,
  			       20000),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
637
638
639
  };
  
  static const struct regulator_linear_range axp803_dcdc6_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
640
641
642
643
644
645
646
647
  	REGULATOR_LINEAR_RANGE(600000,
  			       AXP803_DCDC6_600mV_START,
  			       AXP803_DCDC6_600mV_END,
  			       10000),
  	REGULATOR_LINEAR_RANGE(1120000,
  			       AXP803_DCDC6_1120mV_START,
  			       AXP803_DCDC6_1120mV_END,
  			       20000),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
648
  };
db4a555f7   Olliver Schinagl   regulator: axp20x...
649
  /* AXP806's CLDO2 and AXP809's DLDO1 share the same range */
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
650
  static const struct regulator_linear_range axp803_dldo2_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
651
652
653
654
655
656
657
658
  	REGULATOR_LINEAR_RANGE(700000,
  			       AXP803_DLDO2_700mV_START,
  			       AXP803_DLDO2_700mV_END,
  			       100000),
  	REGULATOR_LINEAR_RANGE(3400000,
  			       AXP803_DLDO2_3400mV_START,
  			       AXP803_DLDO2_3400mV_END,
  			       200000),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
659
660
661
662
  };
  
  static const struct regulator_desc axp803_regulators[] = {
  	AXP_DESC(AXP803, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
  		 AXP803_DCDC1_V_OUT, AXP803_DCDC1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC1_MASK),
  	AXP_DESC_RANGES(AXP803, DCDC2, "dcdc2", "vin2",
  			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  			AXP803_DCDC2_V_OUT, AXP803_DCDC2_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC2_MASK),
  	AXP_DESC_RANGES(AXP803, DCDC3, "dcdc3", "vin3",
  			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  			AXP803_DCDC3_V_OUT, AXP803_DCDC3_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC3_MASK),
  	AXP_DESC_RANGES(AXP803, DCDC4, "dcdc4", "vin4",
  			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  			AXP803_DCDC4_V_OUT, AXP803_DCDC4_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC4_MASK),
  	AXP_DESC_RANGES(AXP803, DCDC5, "dcdc5", "vin5",
  			axp803_dcdc5_ranges, AXP803_DCDC5_NUM_VOLTAGES,
  			AXP803_DCDC5_V_OUT, AXP803_DCDC5_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC5_MASK),
  	AXP_DESC_RANGES(AXP803, DCDC6, "dcdc6", "vin6",
  			axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
  			AXP803_DCDC6_V_OUT, AXP803_DCDC6_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC6_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
685
  	/* secondary switchable output of DCDC1 */
db4a555f7   Olliver Schinagl   regulator: axp20x...
686
687
  	AXP_DESC_SW(AXP803, DC1SW, "dc1sw", NULL,
  		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
688
  	AXP_DESC(AXP803, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
689
690
  		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
691
  	AXP_DESC(AXP803, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
252d1c205   Vasily Khoruzhick   regulator: axp20x...
692
  		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
693
  		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
694
  	AXP_DESC(AXP803, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
695
696
  		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO3_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
697
  	AXP_DESC(AXP803, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
698
699
700
701
  		 AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
  	AXP_DESC_RANGES(AXP803, DLDO2, "dldo2", "dldoin",
  			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
252d1c205   Vasily Khoruzhick   regulator: axp20x...
702
  			AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
703
  			AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
704
  	AXP_DESC(AXP803, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
705
706
  		 AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
707
  	AXP_DESC(AXP803, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
708
709
  		 AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
710
  	AXP_DESC(AXP803, ELDO1, "eldo1", "eldoin", 700, 1900, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
711
712
  		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
713
  	AXP_DESC(AXP803, ELDO2, "eldo2", "eldoin", 700, 1900, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
714
715
  		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
716
  	AXP_DESC(AXP803, ELDO3, "eldo3", "eldoin", 700, 1900, 50,
252d1c205   Vasily Khoruzhick   regulator: axp20x...
717
  		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
718
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
719
  	AXP_DESC(AXP803, FLDO1, "fldo1", "fldoin", 700, 1450, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
720
721
  		 AXP803_FLDO1_V_OUT, AXP803_FLDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO1_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
722
  	AXP_DESC(AXP803, FLDO2, "fldo2", "fldoin", 700, 1450, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
723
724
  		 AXP803_FLDO2_V_OUT, AXP803_FLDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO2_MASK),
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
725
  	AXP_DESC_IO(AXP803, LDO_IO0, "ldo-io0", "ips", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
726
727
  		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
728
729
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  	AXP_DESC_IO(AXP803, LDO_IO1, "ldo-io1", "ips", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
730
731
  		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
732
733
734
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  	AXP_DESC_FIXED(AXP803, RTC_LDO, "rtc-ldo", "ips", 3000),
  };
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
735
  static const struct regulator_linear_range axp806_dcdca_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
736
737
738
739
740
741
742
743
  	REGULATOR_LINEAR_RANGE(600000,
  			       AXP806_DCDCA_600mV_START,
  			       AXP806_DCDCA_600mV_END,
  			       10000),
  	REGULATOR_LINEAR_RANGE(1120000,
  			       AXP806_DCDCA_1120mV_START,
  			       AXP806_DCDCA_1120mV_END,
  			       20000),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
744
  };
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
745
  static const struct regulator_linear_range axp806_dcdcd_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
746
747
748
749
750
  	REGULATOR_LINEAR_RANGE(600000,
  			       AXP806_DCDCD_600mV_START,
  			       AXP806_DCDCD_600mV_END,
  			       20000),
  	REGULATOR_LINEAR_RANGE(1600000,
1ef55fed9   Jernej Skrabec   regulator: axp20x...
751
752
  			       AXP806_DCDCD_1600mV_START,
  			       AXP806_DCDCD_1600mV_END,
db4a555f7   Olliver Schinagl   regulator: axp20x...
753
  			       100000),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
754
  };
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
755
  static const struct regulator_desc axp806_regulators[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
756
757
758
759
  	AXP_DESC_RANGES(AXP806, DCDCA, "dcdca", "vina",
  			axp806_dcdca_ranges, AXP806_DCDCA_NUM_VOLTAGES,
  			AXP806_DCDCA_V_CTRL, AXP806_DCDCA_V_CTRL_MASK,
  			AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCA_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
760
  	AXP_DESC(AXP806, DCDCB, "dcdcb", "vinb", 1000, 2550, 50,
4afa60d3a   Ondrej Jirman   regulator: axp20x...
761
  		 AXP806_DCDCB_V_CTRL, AXP806_DCDCB_V_CTRL_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
762
763
764
765
766
767
768
769
770
  		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCB_MASK),
  	AXP_DESC_RANGES(AXP806, DCDCC, "dcdcc", "vinc",
  			axp806_dcdca_ranges, AXP806_DCDCA_NUM_VOLTAGES,
  			AXP806_DCDCC_V_CTRL, AXP806_DCDCC_V_CTRL_MASK,
  			AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCC_MASK),
  	AXP_DESC_RANGES(AXP806, DCDCD, "dcdcd", "vind",
  			axp806_dcdcd_ranges, AXP806_DCDCD_NUM_VOLTAGES,
  			AXP806_DCDCD_V_CTRL, AXP806_DCDCD_V_CTRL_MASK,
  			AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCD_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
771
  	AXP_DESC(AXP806, DCDCE, "dcdce", "vine", 1100, 3400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
772
773
  		 AXP806_DCDCE_V_CTRL, AXP806_DCDCE_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCE_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
774
  	AXP_DESC(AXP806, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
775
776
  		 AXP806_ALDO1_V_CTRL, AXP806_ALDO1_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO1_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
777
  	AXP_DESC(AXP806, ALDO2, "aldo2", "aldoin", 700, 3400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
778
779
  		 AXP806_ALDO2_V_CTRL, AXP806_ALDO2_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO2_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
780
  	AXP_DESC(AXP806, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
781
782
  		 AXP806_ALDO3_V_CTRL, AXP806_ALDO3_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO3_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
783
  	AXP_DESC(AXP806, BLDO1, "bldo1", "bldoin", 700, 1900, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
784
785
  		 AXP806_BLDO1_V_CTRL, AXP806_BLDO1_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO1_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
786
  	AXP_DESC(AXP806, BLDO2, "bldo2", "bldoin", 700, 1900, 100,
4afa60d3a   Ondrej Jirman   regulator: axp20x...
787
  		 AXP806_BLDO2_V_CTRL, AXP806_BLDO2_V_CTRL_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
788
  		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO2_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
789
  	AXP_DESC(AXP806, BLDO3, "bldo3", "bldoin", 700, 1900, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
790
791
  		 AXP806_BLDO3_V_CTRL, AXP806_BLDO3_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO3_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
792
  	AXP_DESC(AXP806, BLDO4, "bldo4", "bldoin", 700, 1900, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
793
794
  		 AXP806_BLDO4_V_CTRL, AXP806_BLDO4_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO4_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
795
  	AXP_DESC(AXP806, CLDO1, "cldo1", "cldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
796
797
798
799
800
801
  		 AXP806_CLDO1_V_CTRL, AXP806_CLDO1_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO1_MASK),
  	AXP_DESC_RANGES(AXP806, CLDO2, "cldo2", "cldoin",
  			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
  			AXP806_CLDO2_V_CTRL, AXP806_CLDO2_V_CTRL_MASK,
  			AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO2_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
802
  	AXP_DESC(AXP806, CLDO3, "cldo3", "cldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
803
804
805
806
  		 AXP806_CLDO3_V_CTRL, AXP806_CLDO3_V_CTRL_MASK,
  		 AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO3_MASK),
  	AXP_DESC_SW(AXP806, SW, "sw", "swin",
  		    AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_SW_MASK),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
807
808
809
  };
  
  static const struct regulator_linear_range axp809_dcdc4_ranges[] = {
db4a555f7   Olliver Schinagl   regulator: axp20x...
810
811
812
813
814
815
816
817
  	REGULATOR_LINEAR_RANGE(600000,
  			       AXP809_DCDC4_600mV_START,
  			       AXP809_DCDC4_600mV_END,
  			       20000),
  	REGULATOR_LINEAR_RANGE(1800000,
  			       AXP809_DCDC4_1800mV_START,
  			       AXP809_DCDC4_1800mV_END,
  			       100000),
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
818
  };
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
819
820
  static const struct regulator_desc axp809_regulators[] = {
  	AXP_DESC(AXP809, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
821
822
  		 AXP22X_DCDC1_V_OUT, AXP22X_DCDC1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC1_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
823
  	AXP_DESC(AXP809, DCDC2, "dcdc2", "vin2", 600, 1540, 20,
db4a555f7   Olliver Schinagl   regulator: axp20x...
824
825
  		 AXP22X_DCDC2_V_OUT, AXP22X_DCDC2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC2_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
826
  	AXP_DESC(AXP809, DCDC3, "dcdc3", "vin3", 600, 1860, 20,
db4a555f7   Olliver Schinagl   regulator: axp20x...
827
828
829
830
831
832
  		 AXP22X_DCDC3_V_OUT, AXP22X_DCDC3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC3_MASK),
  	AXP_DESC_RANGES(AXP809, DCDC4, "dcdc4", "vin4",
  			axp809_dcdc4_ranges, AXP809_DCDC4_NUM_VOLTAGES,
  			AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC4_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
833
  	AXP_DESC(AXP809, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
834
835
  		 AXP22X_DCDC5_V_OUT, AXP22X_DCDC5_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC5_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
836
  	/* secondary switchable output of DCDC1 */
db4a555f7   Olliver Schinagl   regulator: axp20x...
837
838
  	AXP_DESC_SW(AXP809, DC1SW, "dc1sw", NULL,
  		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
839
840
  	/* LDO regulator internally chained to DCDC5 */
  	AXP_DESC(AXP809, DC5LDO, "dc5ldo", NULL, 700, 1400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
841
842
  		 AXP22X_DC5LDO_V_OUT, AXP22X_DC5LDO_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DC5LDO_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
843
  	AXP_DESC(AXP809, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
844
845
  		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO1_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
846
  	AXP_DESC(AXP809, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
847
848
  		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO2_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
849
  	AXP_DESC(AXP809, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
850
851
852
853
854
855
  		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ALDO3_MASK),
  	AXP_DESC_RANGES(AXP809, DLDO1, "dldo1", "dldoin",
  			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
  			AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
856
  	AXP_DESC(AXP809, DLDO2, "dldo2", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
857
858
  		 AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
859
  	AXP_DESC(AXP809, ELDO1, "eldo1", "eldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
860
861
  		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
862
  	AXP_DESC(AXP809, ELDO2, "eldo2", "eldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
863
864
  		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
865
  	AXP_DESC(AXP809, ELDO3, "eldo3", "eldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
866
867
  		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
618c80896   Chen-Yu Tsai   regulator: axp20x...
868
869
870
871
872
  	/*
  	 * Note the datasheet only guarantees reliable operation up to
  	 * 3.3V, this needs to be enforced via dts provided constraints
  	 */
  	AXP_DESC_IO(AXP809, LDO_IO0, "ldo_io0", "ips", 700, 3800, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
873
874
  		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
875
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
618c80896   Chen-Yu Tsai   regulator: axp20x...
876
877
878
879
880
  	/*
  	 * Note the datasheet only guarantees reliable operation up to
  	 * 3.3V, this needs to be enforced via dts provided constraints
  	 */
  	AXP_DESC_IO(AXP809, LDO_IO1, "ldo_io1", "ips", 700, 3800, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
881
882
  		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
883
884
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  	AXP_DESC_FIXED(AXP809, RTC_LDO, "rtc_ldo", "ips", 1800),
db4a555f7   Olliver Schinagl   regulator: axp20x...
885
886
  	AXP_DESC_SW(AXP809, SW, "sw", "swin",
  		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_SW_MASK),
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
887
  };
d81851c17   Chen-Yu Tsai   regulator: axp20x...
888
889
  static const struct regulator_desc axp813_regulators[] = {
  	AXP_DESC(AXP813, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
  		 AXP803_DCDC1_V_OUT, AXP803_DCDC1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC1_MASK),
  	AXP_DESC_RANGES(AXP813, DCDC2, "dcdc2", "vin2",
  			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  			AXP803_DCDC2_V_OUT, AXP803_DCDC2_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC2_MASK),
  	AXP_DESC_RANGES(AXP813, DCDC3, "dcdc3", "vin3",
  			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  			AXP803_DCDC3_V_OUT, AXP803_DCDC3_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC3_MASK),
  	AXP_DESC_RANGES(AXP813, DCDC4, "dcdc4", "vin4",
  			axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  			AXP803_DCDC4_V_OUT, AXP803_DCDC4_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC4_MASK),
  	AXP_DESC_RANGES(AXP813, DCDC5, "dcdc5", "vin5",
  			axp803_dcdc5_ranges, AXP803_DCDC5_NUM_VOLTAGES,
  			AXP803_DCDC5_V_OUT, AXP803_DCDC5_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC5_MASK),
  	AXP_DESC_RANGES(AXP813, DCDC6, "dcdc6", "vin6",
  			axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
  			AXP803_DCDC6_V_OUT, AXP803_DCDC6_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC6_MASK),
  	AXP_DESC_RANGES(AXP813, DCDC7, "dcdc7", "vin7",
  			axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
  			AXP813_DCDC7_V_OUT, AXP813_DCDC7_V_OUT_MASK,
  			AXP22X_PWR_OUT_CTRL1, AXP813_PWR_OUT_DCDC7_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
916
  	AXP_DESC(AXP813, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
917
918
  		 AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
919
  	AXP_DESC(AXP813, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
d02337709   Axel Lin   regulator: axp20x...
920
  		 AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
921
  		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
922
  	AXP_DESC(AXP813, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
923
924
  		 AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO3_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
925
  	AXP_DESC(AXP813, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
926
927
928
929
  		 AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
  	AXP_DESC_RANGES(AXP813, DLDO2, "dldo2", "dldoin",
  			axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
d02337709   Axel Lin   regulator: axp20x...
930
  			AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
931
  			AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
932
  	AXP_DESC(AXP813, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
933
934
  		 AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
935
  	AXP_DESC(AXP813, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
936
937
  		 AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
938
  	AXP_DESC(AXP813, ELDO1, "eldo1", "eldoin", 700, 1900, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
939
940
  		 AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
941
  	AXP_DESC(AXP813, ELDO2, "eldo2", "eldoin", 700, 1900, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
942
943
  		 AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
944
  	AXP_DESC(AXP813, ELDO3, "eldo3", "eldoin", 700, 1900, 50,
d02337709   Axel Lin   regulator: axp20x...
945
  		 AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
db4a555f7   Olliver Schinagl   regulator: axp20x...
946
  		 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
947
948
  	/* to do / check ... */
  	AXP_DESC(AXP813, FLDO1, "fldo1", "fldoin", 700, 1450, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
949
950
  		 AXP803_FLDO1_V_OUT, AXP803_FLDO1_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO1_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
951
  	AXP_DESC(AXP813, FLDO2, "fldo2", "fldoin", 700, 1450, 50,
db4a555f7   Olliver Schinagl   regulator: axp20x...
952
953
  		 AXP803_FLDO2_V_OUT, AXP803_FLDO2_V_OUT_MASK,
  		 AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO2_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
954
955
956
957
958
959
960
961
  	/*
  	 * TODO: FLDO3 = {DCDC5, FLDOIN} / 2
  	 *
  	 * This means FLDO3 effectively switches supplies at runtime,
  	 * something the regulator subsystem does not support.
  	 */
  	AXP_DESC_FIXED(AXP813, RTC_LDO, "rtc-ldo", "ips", 1800),
  	AXP_DESC_IO(AXP813, LDO_IO0, "ldo-io0", "ips", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
962
963
  		    AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  		    AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
d81851c17   Chen-Yu Tsai   regulator: axp20x...
964
965
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  	AXP_DESC_IO(AXP813, LDO_IO1, "ldo-io1", "ips", 700, 3300, 100,
db4a555f7   Olliver Schinagl   regulator: axp20x...
966
967
  		    AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  		    AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
d81851c17   Chen-Yu Tsai   regulator: axp20x...
968
  		    AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
db4a555f7   Olliver Schinagl   regulator: axp20x...
969
970
  	AXP_DESC_SW(AXP813, SW, "sw", "swin",
  		    AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
d81851c17   Chen-Yu Tsai   regulator: axp20x...
971
  };
dfe7a1b05   Carlo Caione   regulator: AXP20x...
972
973
974
  static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
  {
  	struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
975
  	unsigned int reg = AXP20X_DCDC_FREQ;
866bd951f   Boris BREZILLON   regulator: axp20x...
976
977
978
979
980
981
982
983
984
985
  	u32 min, max, def, step;
  
  	switch (axp20x->variant) {
  	case AXP202_ID:
  	case AXP209_ID:
  		min = 750;
  		max = 1875;
  		def = 1500;
  		step = 75;
  		break;
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
986
  	case AXP803_ID:
d81851c17   Chen-Yu Tsai   regulator: axp20x...
987
  	case AXP813_ID:
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
988
  		/*
d81851c17   Chen-Yu Tsai   regulator: axp20x...
989
990
  		 * AXP803/AXP813 DCDC work frequency setting has the same
  		 * range and step as AXP22X, but at a different register.
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
991
992
  		 * (See include/linux/mfd/axp20x.h)
  		 */
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
993
  		reg = AXP803_DCDC_FREQ_CTRL;
563943864   Gustavo A. R. Silva   regulator: axp20x...
994
  		/* Fall through - to the check below.*/
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
995
996
997
998
999
1000
1001
  	case AXP806_ID:
  		/*
  		 * AXP806 also have DCDC work frequency setting register at a
  		 * different position.
  		 */
  		if (axp20x->variant == AXP806_ID)
  			reg = AXP806_DCDC_FREQ_CTRL;
4b03227a6   Gustavo A. R. Silva   regulator: axp20x...
1002
  		/* Fall through */
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
1003
  	case AXP221_ID:
04e0981c6   Chen-Yu Tsai   regulator: axp20x...
1004
  	case AXP223_ID:
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1005
  	case AXP809_ID:
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
1006
1007
1008
1009
1010
  		min = 1800;
  		max = 4050;
  		def = 3000;
  		step = 150;
  		break;
866bd951f   Boris BREZILLON   regulator: axp20x...
1011
1012
1013
1014
1015
1016
1017
1018
1019
  	default:
  		dev_err(&pdev->dev,
  			"Setting DCDC frequency for unsupported AXP variant
  ");
  		return -EINVAL;
  	}
  
  	if (dcdcfreq == 0)
  		dcdcfreq = def;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1020

866bd951f   Boris BREZILLON   regulator: axp20x...
1021
1022
1023
1024
1025
  	if (dcdcfreq < min) {
  		dcdcfreq = min;
  		dev_warn(&pdev->dev, "DCDC frequency too low. Set to %ukHz
  ",
  			 min);
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1026
  	}
866bd951f   Boris BREZILLON   regulator: axp20x...
1027
1028
1029
1030
1031
  	if (dcdcfreq > max) {
  		dcdcfreq = max;
  		dev_warn(&pdev->dev, "DCDC frequency too high. Set to %ukHz
  ",
  			 max);
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1032
  	}
866bd951f   Boris BREZILLON   regulator: axp20x...
1033
  	dcdcfreq = (dcdcfreq - min) / step;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1034

2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1035
  	return regmap_update_bits(axp20x->regmap, reg,
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1036
1037
1038
1039
1040
1041
1042
  				  AXP20X_FREQ_DCDC_MASK, dcdcfreq);
  }
  
  static int axp20x_regulator_parse_dt(struct platform_device *pdev)
  {
  	struct device_node *np, *regulators;
  	int ret;
866bd951f   Boris BREZILLON   regulator: axp20x...
1043
  	u32 dcdcfreq = 0;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1044
1045
1046
1047
  
  	np = of_node_get(pdev->dev.parent->of_node);
  	if (!np)
  		return 0;
a6016c523   Boris BREZILLON   regulator: AXP20x...
1048
  	regulators = of_get_child_by_name(np, "regulators");
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1049
1050
1051
1052
  	if (!regulators) {
  		dev_warn(&pdev->dev, "regulators node not found
  ");
  	} else {
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
  		of_property_read_u32(regulators, "x-powers,dcdc-freq", &dcdcfreq);
  		ret = axp20x_set_dcdc_freq(pdev, dcdcfreq);
  		if (ret < 0) {
  			dev_err(&pdev->dev, "Error setting dcdc frequency: %d
  ", ret);
  			return ret;
  		}
  
  		of_node_put(regulators);
  	}
  
  	return 0;
  }
  
  static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 workmode)
  {
866bd951f   Boris BREZILLON   regulator: axp20x...
1069
  	struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1070
  	unsigned int reg = AXP20X_DCDC_MODE;
866bd951f   Boris BREZILLON   regulator: axp20x...
1071
  	unsigned int mask;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1072

866bd951f   Boris BREZILLON   regulator: axp20x...
1073
1074
1075
1076
1077
1078
1079
1080
1081
  	switch (axp20x->variant) {
  	case AXP202_ID:
  	case AXP209_ID:
  		if ((id != AXP20X_DCDC2) && (id != AXP20X_DCDC3))
  			return -EINVAL;
  
  		mask = AXP20X_WORKMODE_DCDC2_MASK;
  		if (id == AXP20X_DCDC3)
  			mask = AXP20X_WORKMODE_DCDC3_MASK;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1082

866bd951f   Boris BREZILLON   regulator: axp20x...
1083
1084
  		workmode <<= ffs(mask) - 1;
  		break;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1085

2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1086
  	case AXP806_ID:
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1087
1088
  		/*
  		 * AXP806 DCDC regulator IDs have the same range as AXP22X.
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1089
1090
  		 * (See include/linux/mfd/axp20x.h)
  		 */
563943864   Gustavo A. R. Silva   regulator: axp20x...
1091
1092
  		reg = AXP806_DCDC_MODE_CTRL2;
  		 /* Fall through - to the check below. */
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
1093
  	case AXP221_ID:
04e0981c6   Chen-Yu Tsai   regulator: axp20x...
1094
  	case AXP223_ID:
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1095
  	case AXP809_ID:
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
1096
1097
1098
1099
1100
1101
  		if (id < AXP22X_DCDC1 || id > AXP22X_DCDC5)
  			return -EINVAL;
  
  		mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP22X_DCDC1);
  		workmode <<= id - AXP22X_DCDC1;
  		break;
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1102
1103
1104
1105
1106
1107
1108
  	case AXP803_ID:
  		if (id < AXP803_DCDC1 || id > AXP803_DCDC6)
  			return -EINVAL;
  
  		mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP803_DCDC1);
  		workmode <<= id - AXP803_DCDC1;
  		break;
d81851c17   Chen-Yu Tsai   regulator: axp20x...
1109
1110
1111
1112
1113
1114
1115
  	case AXP813_ID:
  		if (id < AXP813_DCDC1 || id > AXP813_DCDC7)
  			return -EINVAL;
  
  		mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP813_DCDC1);
  		workmode <<= id - AXP813_DCDC1;
  		break;
866bd951f   Boris BREZILLON   regulator: axp20x...
1116
1117
1118
1119
1120
  	default:
  		/* should not happen */
  		WARN_ON(1);
  		return -EINVAL;
  	}
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1121

2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
  	return regmap_update_bits(rdev->regmap, reg, mask, workmode);
  }
  
  /*
   * This function checks whether a regulator is part of a poly-phase
   * output setup based on the registers settings. Returns true if it is.
   */
  static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id)
  {
  	u32 reg = 0;
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1132
  	/*
d81851c17   Chen-Yu Tsai   regulator: axp20x...
1133
1134
  	 * Currently in our supported AXP variants, only AXP803, AXP806,
  	 * and AXP813 have polyphase regulators.
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1135
1136
1137
  	 */
  	switch (axp20x->variant) {
  	case AXP803_ID:
ad92ceaf3   Axel Lin   regulator: axp20x...
1138
  	case AXP813_ID:
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1139
1140
1141
1142
  		regmap_read(axp20x->regmap, AXP803_POLYPHASE_CTRL, &reg);
  
  		switch (id) {
  		case AXP803_DCDC3:
db4a555f7   Olliver Schinagl   regulator: axp20x...
1143
  			return !!(reg & AXP803_DCDC23_POLYPHASE_DUAL);
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1144
  		case AXP803_DCDC6:
db4a555f7   Olliver Schinagl   regulator: axp20x...
1145
  			return !!(reg & AXP803_DCDC56_POLYPHASE_DUAL);
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1146
1147
  		}
  		break;
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1148

1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1149
1150
1151
1152
1153
  	case AXP806_ID:
  		regmap_read(axp20x->regmap, AXP806_DCDC_MODE_CTRL2, &reg);
  
  		switch (id) {
  		case AXP806_DCDCB:
db4a555f7   Olliver Schinagl   regulator: axp20x...
1154
1155
1156
1157
  			return (((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
  				AXP806_DCDCAB_POLYPHASE_DUAL) ||
  				((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
  				AXP806_DCDCABC_POLYPHASE_TRI));
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1158
  		case AXP806_DCDCC:
db4a555f7   Olliver Schinagl   regulator: axp20x...
1159
1160
  			return ((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
  				AXP806_DCDCABC_POLYPHASE_TRI);
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1161
  		case AXP806_DCDCE:
db4a555f7   Olliver Schinagl   regulator: axp20x...
1162
  			return !!(reg & AXP806_DCDCDE_POLYPHASE_DUAL);
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1163
1164
  		}
  		break;
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1165

1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1166
1167
  	default:
  		return false;
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1168
1169
1170
  	}
  
  	return false;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1171
1172
1173
1174
1175
1176
  }
  
  static int axp20x_regulator_probe(struct platform_device *pdev)
  {
  	struct regulator_dev *rdev;
  	struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
866bd951f   Boris BREZILLON   regulator: axp20x...
1177
  	const struct regulator_desc *regulators;
765e80232   Chen-Yu Tsai   regulator: axp20x...
1178
1179
1180
  	struct regulator_config config = {
  		.dev = pdev->dev.parent,
  		.regmap = axp20x->regmap,
866bd951f   Boris BREZILLON   regulator: axp20x...
1181
  		.driver_data = axp20x,
765e80232   Chen-Yu Tsai   regulator: axp20x...
1182
  	};
866bd951f   Boris BREZILLON   regulator: axp20x...
1183
  	int ret, i, nregulators;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1184
  	u32 workmode;
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1185
1186
  	const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name;
  	const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name;
636e2a39c   Hans de Goede   regulator: axp20x...
1187
  	bool drivevbus = false;
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1188

866bd951f   Boris BREZILLON   regulator: axp20x...
1189
1190
1191
1192
1193
1194
  	switch (axp20x->variant) {
  	case AXP202_ID:
  	case AXP209_ID:
  		regulators = axp20x_regulators;
  		nregulators = AXP20X_REG_ID_MAX;
  		break;
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
1195
  	case AXP221_ID:
04e0981c6   Chen-Yu Tsai   regulator: axp20x...
1196
  	case AXP223_ID:
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
1197
1198
  		regulators = axp22x_regulators;
  		nregulators = AXP22X_REG_ID_MAX;
636e2a39c   Hans de Goede   regulator: axp20x...
1199
1200
  		drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
  						  "x-powers,drive-vbus-en");
1b82b4e4f   Boris BREZILLON   regulator: axp20x...
1201
  		break;
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1202
1203
1204
  	case AXP803_ID:
  		regulators = axp803_regulators;
  		nregulators = AXP803_REG_ID_MAX;
1f5d6462b   Jagan Teki   regulator: axp20x...
1205
1206
  		drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
  						  "x-powers,drive-vbus-en");
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1207
  		break;
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1208
1209
1210
1211
  	case AXP806_ID:
  		regulators = axp806_regulators;
  		nregulators = AXP806_REG_ID_MAX;
  		break;
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1212
1213
1214
1215
  	case AXP809_ID:
  		regulators = axp809_regulators;
  		nregulators = AXP809_REG_ID_MAX;
  		break;
d81851c17   Chen-Yu Tsai   regulator: axp20x...
1216
1217
1218
1219
1220
1221
  	case AXP813_ID:
  		regulators = axp813_regulators;
  		nregulators = AXP813_REG_ID_MAX;
  		drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
  						  "x-powers,drive-vbus-en");
  		break;
866bd951f   Boris BREZILLON   regulator: axp20x...
1222
1223
1224
1225
1226
1227
  	default:
  		dev_err(&pdev->dev, "Unsupported AXP variant: %ld
  ",
  			axp20x->variant);
  		return -EINVAL;
  	}
765e80232   Chen-Yu Tsai   regulator: axp20x...
1228
1229
  	/* This only sets the dcdc freq. Ignore any errors */
  	axp20x_regulator_parse_dt(pdev);
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1230

866bd951f   Boris BREZILLON   regulator: axp20x...
1231
  	for (i = 0; i < nregulators; i++) {
7118f19c4   Chen-Yu Tsai   regulator: axp20x...
1232
1233
1234
1235
  		const struct regulator_desc *desc = &regulators[i];
  		struct regulator_desc *new_desc;
  
  		/*
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1236
1237
1238
1239
1240
1241
  		 * If this regulator is a slave in a poly-phase setup,
  		 * skip it, as its controls are bound to the master
  		 * regulator and won't work.
  		 */
  		if (axp20x_is_polyphase_slave(axp20x, i))
  			continue;
d81851c17   Chen-Yu Tsai   regulator: axp20x...
1242
1243
1244
  		/* Support for AXP813's FLDO3 is not implemented */
  		if (axp20x->variant == AXP813_ID && i == AXP813_FLDO3)
  			continue;
2ca342d39   Chen-Yu Tsai   regulator: axp20x...
1245
  		/*
7118f19c4   Chen-Yu Tsai   regulator: axp20x...
1246
1247
1248
1249
1250
1251
1252
1253
  		 * Regulators DC1SW and DC5LDO are connected internally,
  		 * so we have to handle their supply names separately.
  		 *
  		 * We always register the regulators in proper sequence,
  		 * so the supply names are correctly read. See the last
  		 * part of this loop to see where we save the DT defined
  		 * name.
  		 */
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1254
  		if ((regulators == axp22x_regulators && i == AXP22X_DC1SW) ||
1dbe0ccb0   Icenowy Zheng   regulator: axp20x...
1255
  		    (regulators == axp803_regulators && i == AXP803_DC1SW) ||
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1256
1257
1258
  		    (regulators == axp809_regulators && i == AXP809_DC1SW)) {
  			new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
  						GFP_KERNEL);
da2629684   Gustavo A. R. Silva   regulator: axp20x...
1259
1260
  			if (!new_desc)
  				return -ENOMEM;
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1261
1262
1263
1264
1265
1266
1267
1268
1269
  			*new_desc = regulators[i];
  			new_desc->supply_name = dcdc1_name;
  			desc = new_desc;
  		}
  
  		if ((regulators == axp22x_regulators && i == AXP22X_DC5LDO) ||
  		    (regulators == axp809_regulators && i == AXP809_DC5LDO)) {
  			new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
  						GFP_KERNEL);
da2629684   Gustavo A. R. Silva   regulator: axp20x...
1270
1271
  			if (!new_desc)
  				return -ENOMEM;
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1272
1273
1274
  			*new_desc = regulators[i];
  			new_desc->supply_name = dcdc5_name;
  			desc = new_desc;
7118f19c4   Chen-Yu Tsai   regulator: axp20x...
1275
1276
1277
  		}
  
  		rdev = devm_regulator_register(&pdev->dev, desc, &config);
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1278
1279
1280
  		if (IS_ERR(rdev)) {
  			dev_err(&pdev->dev, "Failed to register %s
  ",
866bd951f   Boris BREZILLON   regulator: axp20x...
1281
  				regulators[i].name);
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1282
1283
1284
  
  			return PTR_ERR(rdev);
  		}
765e80232   Chen-Yu Tsai   regulator: axp20x...
1285
1286
  		ret = of_property_read_u32(rdev->dev.of_node,
  					   "x-powers,dcdc-workmode",
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1287
1288
1289
1290
1291
  					   &workmode);
  		if (!ret) {
  			if (axp20x_set_dcdc_workmode(rdev, i, workmode))
  				dev_err(&pdev->dev, "Failed to set workmode on %s
  ",
866bd951f   Boris BREZILLON   regulator: axp20x...
1292
  					rdev->desc->name);
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1293
  		}
7118f19c4   Chen-Yu Tsai   regulator: axp20x...
1294
1295
1296
1297
  
  		/*
  		 * Save AXP22X DCDC1 / DCDC5 regulator names for later.
  		 */
a51f9f462   Chen-Yu Tsai   regulator: axp20x...
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
  		if ((regulators == axp22x_regulators && i == AXP22X_DCDC1) ||
  		    (regulators == axp809_regulators && i == AXP809_DCDC1))
  			of_property_read_string(rdev->dev.of_node,
  						"regulator-name",
  						&dcdc1_name);
  
  		if ((regulators == axp22x_regulators && i == AXP22X_DCDC5) ||
  		    (regulators == axp809_regulators && i == AXP809_DCDC5))
  			of_property_read_string(rdev->dev.of_node,
  						"regulator-name",
  						&dcdc5_name);
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1309
  	}
636e2a39c   Hans de Goede   regulator: axp20x...
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
  	if (drivevbus) {
  		/* Change N_VBUSEN sense pin to DRIVEVBUS output pin */
  		regmap_update_bits(axp20x->regmap, AXP20X_OVER_TMP,
  				   AXP22X_MISC_N_VBUSEN_FUNC, 0);
  		rdev = devm_regulator_register(&pdev->dev,
  					       &axp22x_drivevbus_regulator,
  					       &config);
  		if (IS_ERR(rdev)) {
  			dev_err(&pdev->dev, "Failed to register drivevbus
  ");
  			return PTR_ERR(rdev);
  		}
  	}
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1323
1324
1325
1326
1327
1328
1329
  	return 0;
  }
  
  static struct platform_driver axp20x_regulator_driver = {
  	.probe	= axp20x_regulator_probe,
  	.driver	= {
  		.name		= "axp20x-regulator",
dfe7a1b05   Carlo Caione   regulator: AXP20x...
1330
1331
1332
1333
1334
1335
1336
1337
  	},
  };
  
  module_platform_driver(axp20x_regulator_driver);
  
  MODULE_LICENSE("GPL v2");
  MODULE_AUTHOR("Carlo Caione <carlo@caione.org>");
  MODULE_DESCRIPTION("Regulator Driver for AXP20X PMIC");
d4ea7d864   Ian Campbell   regulator: axp20x...
1338
  MODULE_ALIAS("platform:axp20x-regulator");