Blame view

drivers/regulator/s2mps11.c 41.5 KB
4f3fb2873   Krzysztof Kozlowski   regulator: samsun...
1
2
3
4
  // SPDX-License-Identifier: GPL-2.0+
  //
  // Copyright (c) 2012-2014 Samsung Electronics Co., Ltd
  //              http://www.samsung.com
cb74685ec   Sangbeom Kim   regulator: s2mps1...
5
6
  
  #include <linux/bug.h>
cb74685ec   Sangbeom Kim   regulator: s2mps1...
7
  #include <linux/err.h>
1c984942f   Linus Walleij   regulator: s2mps1...
8
  #include <linux/gpio/consumer.h>
cb74685ec   Sangbeom Kim   regulator: s2mps1...
9
10
  #include <linux/slab.h>
  #include <linux/module.h>
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
11
  #include <linux/of.h>
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
12
  #include <linux/regmap.h>
cb74685ec   Sangbeom Kim   regulator: s2mps1...
13
14
15
  #include <linux/platform_device.h>
  #include <linux/regulator/driver.h>
  #include <linux/regulator/machine.h>
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
16
  #include <linux/regulator/of_regulator.h>
cb74685ec   Sangbeom Kim   regulator: s2mps1...
17
18
  #include <linux/mfd/samsung/core.h>
  #include <linux/mfd/samsung/s2mps11.h>
76b9840b2   Chanwoo Choi   regulator: s2mps1...
19
  #include <linux/mfd/samsung/s2mps13.h>
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
20
  #include <linux/mfd/samsung/s2mps14.h>
51af20675   Thomas Abraham   regulator: s2mps1...
21
  #include <linux/mfd/samsung/s2mps15.h>
00e2573d2   Chanwoo Choi   regulator: s2mps1...
22
  #include <linux/mfd/samsung/s2mpu02.h>
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
23

32c848e33   Krzysztof Kozlowski   regulator: s2mps1...
24
25
  /* The highest number of possible regulators for supported devices. */
  #define S2MPS_REGULATOR_MAX		S2MPS13_REGULATOR_MAX
cb74685ec   Sangbeom Kim   regulator: s2mps1...
26
  struct s2mps11_info {
cb74685ec   Sangbeom Kim   regulator: s2mps1...
27
28
29
30
31
32
  	int ramp_delay2;
  	int ramp_delay34;
  	int ramp_delay5;
  	int ramp_delay16;
  	int ramp_delay7810;
  	int ramp_delay9;
00e2573d2   Chanwoo Choi   regulator: s2mps1...
33
34
  
  	enum sec_device_type dev_type;
05be09bb5   Krzysztof Kozlowski   regulator: s2mps1...
35
  	/*
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
36
  	 * One bit for each S2MPS11/S2MPS13/S2MPS14/S2MPU02 regulator whether
76b9840b2   Chanwoo Choi   regulator: s2mps1...
37
  	 * the suspend mode was enabled.
05be09bb5   Krzysztof Kozlowski   regulator: s2mps1...
38
  	 */
32c848e33   Krzysztof Kozlowski   regulator: s2mps1...
39
  	DECLARE_BITMAP(suspend_state, S2MPS_REGULATOR_MAX);
00e2573d2   Chanwoo Choi   regulator: s2mps1...
40

7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
41
42
43
44
  	/*
  	 * Array (size: number of regulators) with GPIO-s for external
  	 * sleep control.
  	 */
1c984942f   Linus Walleij   regulator: s2mps1...
45
  	struct gpio_desc **ext_control_gpiod;
cb74685ec   Sangbeom Kim   regulator: s2mps1...
46
47
48
49
50
  };
  
  static int get_ramp_delay(int ramp_delay)
  {
  	unsigned char cnt = 0;
90068348b   Yadwinder Singh Brar   regulator: s2mps1...
51
  	ramp_delay /= 6250;
cb74685ec   Sangbeom Kim   regulator: s2mps1...
52
53
54
55
56
57
58
  
  	while (true) {
  		ramp_delay = ramp_delay >> 1;
  		if (ramp_delay == 0)
  			break;
  		cnt++;
  	}
f8f1d48be   Axel Lin   regulator: s2mps1...
59
60
61
  
  	if (cnt > 3)
  		cnt = 3;
cb74685ec   Sangbeom Kim   regulator: s2mps1...
62
63
  	return cnt;
  }
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
64
65
66
67
68
  static int s2mps11_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
  				   unsigned int old_selector,
  				   unsigned int new_selector)
  {
  	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
df33799c5   Krzysztof Kozlowski   regulator: s2mps1...
69
  	int rdev_id = rdev_get_id(rdev);
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
70
71
  	unsigned int ramp_delay = 0;
  	int old_volt, new_volt;
df33799c5   Krzysztof Kozlowski   regulator: s2mps1...
72
  	switch (rdev_id) {
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
73
  	case S2MPS11_BUCK2:
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
74
75
76
  		ramp_delay = s2mps11->ramp_delay2;
  		break;
  	case S2MPS11_BUCK3:
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
77
  	case S2MPS11_BUCK4:
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
78
79
80
81
82
83
  		ramp_delay = s2mps11->ramp_delay34;
  		break;
  	case S2MPS11_BUCK5:
  		ramp_delay = s2mps11->ramp_delay5;
  		break;
  	case S2MPS11_BUCK6:
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  	case S2MPS11_BUCK1:
  		ramp_delay = s2mps11->ramp_delay16;
  		break;
  	case S2MPS11_BUCK7:
  	case S2MPS11_BUCK8:
  	case S2MPS11_BUCK10:
  		ramp_delay = s2mps11->ramp_delay7810;
  		break;
  	case S2MPS11_BUCK9:
  		ramp_delay = s2mps11->ramp_delay9;
  	}
  
  	if (ramp_delay == 0)
  		ramp_delay = rdev->desc->ramp_delay;
  
  	old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector);
  	new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector);
  
  	return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay);
  }
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
104
105
106
107
108
  static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
  {
  	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
  	unsigned int ramp_val, ramp_shift, ramp_reg = S2MPS11_REG_RAMP_BUCK;
  	unsigned int ramp_enable = 1, enable_shift = 0;
df33799c5   Krzysztof Kozlowski   regulator: s2mps1...
109
  	int rdev_id = rdev_get_id(rdev);
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
110
  	int ret;
df33799c5   Krzysztof Kozlowski   regulator: s2mps1...
111
  	switch (rdev_id) {
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
  	case S2MPS11_BUCK1:
  		if (ramp_delay > s2mps11->ramp_delay16)
  			s2mps11->ramp_delay16 = ramp_delay;
  		else
  			ramp_delay = s2mps11->ramp_delay16;
  
  		ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT;
  		break;
  	case S2MPS11_BUCK2:
  		enable_shift = S2MPS11_BUCK2_RAMP_EN_SHIFT;
  		if (!ramp_delay) {
  			ramp_enable = 0;
  			break;
  		}
  
  		s2mps11->ramp_delay2 = ramp_delay;
  		ramp_shift = S2MPS11_BUCK2_RAMP_SHIFT;
  		ramp_reg = S2MPS11_REG_RAMP;
  		break;
  	case S2MPS11_BUCK3:
  		enable_shift = S2MPS11_BUCK3_RAMP_EN_SHIFT;
  		if (!ramp_delay) {
  			ramp_enable = 0;
  			break;
  		}
  
  		if (ramp_delay > s2mps11->ramp_delay34)
  			s2mps11->ramp_delay34 = ramp_delay;
  		else
  			ramp_delay = s2mps11->ramp_delay34;
  
  		ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT;
  		ramp_reg = S2MPS11_REG_RAMP;
  		break;
  	case S2MPS11_BUCK4:
  		enable_shift = S2MPS11_BUCK4_RAMP_EN_SHIFT;
  		if (!ramp_delay) {
  			ramp_enable = 0;
  			break;
  		}
  
  		if (ramp_delay > s2mps11->ramp_delay34)
  			s2mps11->ramp_delay34 = ramp_delay;
  		else
  			ramp_delay = s2mps11->ramp_delay34;
  
  		ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT;
  		ramp_reg = S2MPS11_REG_RAMP;
  		break;
  	case S2MPS11_BUCK5:
  		s2mps11->ramp_delay5 = ramp_delay;
  		ramp_shift = S2MPS11_BUCK5_RAMP_SHIFT;
  		break;
  	case S2MPS11_BUCK6:
  		enable_shift = S2MPS11_BUCK6_RAMP_EN_SHIFT;
  		if (!ramp_delay) {
  			ramp_enable = 0;
  			break;
  		}
  
  		if (ramp_delay > s2mps11->ramp_delay16)
  			s2mps11->ramp_delay16 = ramp_delay;
  		else
  			ramp_delay = s2mps11->ramp_delay16;
  
  		ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT;
  		break;
  	case S2MPS11_BUCK7:
  	case S2MPS11_BUCK8:
  	case S2MPS11_BUCK10:
  		if (ramp_delay > s2mps11->ramp_delay7810)
  			s2mps11->ramp_delay7810 = ramp_delay;
  		else
  			ramp_delay = s2mps11->ramp_delay7810;
  
  		ramp_shift = S2MPS11_BUCK7810_RAMP_SHIFT;
  		break;
  	case S2MPS11_BUCK9:
  		s2mps11->ramp_delay9 = ramp_delay;
  		ramp_shift = S2MPS11_BUCK9_RAMP_SHIFT;
  		break;
  	default:
  		return 0;
  	}
  
  	if (!ramp_enable)
  		goto ramp_disable;
b203e0dfe   Krzysztof Kozlowski   regulator: s2mps1...
199
  	/* Ramp delay can be enabled/disabled only for buck[2346] */
df33799c5   Krzysztof Kozlowski   regulator: s2mps1...
200
201
  	if ((rdev_id >= S2MPS11_BUCK2 && rdev_id <= S2MPS11_BUCK4) ||
  	    rdev_id == S2MPS11_BUCK6)  {
b203e0dfe   Krzysztof Kozlowski   regulator: s2mps1...
202
203
204
205
206
207
208
  		ret = regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
  					 1 << enable_shift, 1 << enable_shift);
  		if (ret) {
  			dev_err(&rdev->dev, "failed to enable ramp rate
  ");
  			return ret;
  		}
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
209
210
211
  	}
  
  	ramp_val = get_ramp_delay(ramp_delay);
f8f1d48be   Axel Lin   regulator: s2mps1...
212
213
  	return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift,
  				  ramp_val << ramp_shift);
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
214
215
  
  ramp_disable:
80853304c   Axel Lin   regulator: s2mps1...
216
217
  	return regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
  				  1 << enable_shift, 0);
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
218
  }
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
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
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
  static int s2mps11_regulator_enable(struct regulator_dev *rdev)
  {
  	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
  	int rdev_id = rdev_get_id(rdev);
  	unsigned int val;
  
  	switch (s2mps11->dev_type) {
  	case S2MPS11X:
  		if (test_bit(rdev_id, s2mps11->suspend_state))
  			val = S2MPS14_ENABLE_SUSPEND;
  		else
  			val = rdev->desc->enable_mask;
  		break;
  	case S2MPS13X:
  	case S2MPS14X:
  		if (test_bit(rdev_id, s2mps11->suspend_state))
  			val = S2MPS14_ENABLE_SUSPEND;
  		else if (s2mps11->ext_control_gpiod[rdev_id])
  			val = S2MPS14_ENABLE_EXT_CONTROL;
  		else
  			val = rdev->desc->enable_mask;
  		break;
  	case S2MPU02:
  		if (test_bit(rdev_id, s2mps11->suspend_state))
  			val = S2MPU02_ENABLE_SUSPEND;
  		else
  			val = rdev->desc->enable_mask;
  		break;
  	default:
  		return -EINVAL;
  	}
  
  	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  			rdev->desc->enable_mask, val);
  }
  
  static int s2mps11_regulator_set_suspend_disable(struct regulator_dev *rdev)
  {
  	int ret;
  	unsigned int val, state;
  	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
  	int rdev_id = rdev_get_id(rdev);
  
  	/* Below LDO should be always on or does not support suspend mode. */
  	switch (s2mps11->dev_type) {
  	case S2MPS11X:
  		switch (rdev_id) {
  		case S2MPS11_LDO2:
  		case S2MPS11_LDO36:
  		case S2MPS11_LDO37:
  		case S2MPS11_LDO38:
  			return 0;
  		default:
  			state = S2MPS14_ENABLE_SUSPEND;
  			break;
  		}
  		break;
  	case S2MPS13X:
  	case S2MPS14X:
  		switch (rdev_id) {
  		case S2MPS14_LDO3:
  			return 0;
  		default:
  			state = S2MPS14_ENABLE_SUSPEND;
  			break;
  		}
  		break;
  	case S2MPU02:
  		switch (rdev_id) {
  		case S2MPU02_LDO13:
  		case S2MPU02_LDO14:
  		case S2MPU02_LDO15:
  		case S2MPU02_LDO17:
  		case S2MPU02_BUCK7:
  			state = S2MPU02_DISABLE_SUSPEND;
  			break;
  		default:
  			state = S2MPU02_ENABLE_SUSPEND;
  			break;
  		}
  		break;
  	default:
  		return -EINVAL;
  	}
  
  	ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
  	if (ret < 0)
  		return ret;
  
  	set_bit(rdev_id, s2mps11->suspend_state);
  	/*
  	 * Don't enable suspend mode if regulator is already disabled because
  	 * this would effectively for a short time turn on the regulator after
  	 * resuming.
  	 * However we still want to toggle the suspend_state bit for regulator
  	 * in case if it got enabled before suspending the system.
  	 */
  	if (!(val & rdev->desc->enable_mask))
  		return 0;
  
  	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  				  rdev->desc->enable_mask, state);
  }
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
322
  static const struct regulator_ops s2mps11_ldo_ops = {
cb74685ec   Sangbeom Kim   regulator: s2mps1...
323
324
325
  	.list_voltage		= regulator_list_voltage_linear,
  	.map_voltage		= regulator_map_voltage_linear,
  	.is_enabled		= regulator_is_enabled_regmap,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
326
  	.enable			= s2mps11_regulator_enable,
cb74685ec   Sangbeom Kim   regulator: s2mps1...
327
328
329
330
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
331
  	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
cb74685ec   Sangbeom Kim   regulator: s2mps1...
332
  };
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
333
  static const struct regulator_ops s2mps11_buck_ops = {
cb74685ec   Sangbeom Kim   regulator: s2mps1...
334
335
336
  	.list_voltage		= regulator_list_voltage_linear,
  	.map_voltage		= regulator_map_voltage_linear,
  	.is_enabled		= regulator_is_enabled_regmap,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
337
  	.enable			= s2mps11_regulator_enable,
cb74685ec   Sangbeom Kim   regulator: s2mps1...
338
339
340
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
1e1598ed0   Yadwinder Singh Brar   regulator: s2mps1...
341
  	.set_voltage_time_sel	= s2mps11_regulator_set_voltage_time_sel,
939c02777   Yadwinder Singh Brar   regulator: s2mps1...
342
  	.set_ramp_delay		= s2mps11_set_ramp_delay,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
343
  	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
cb74685ec   Sangbeom Kim   regulator: s2mps1...
344
  };
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
345
  #define regulator_desc_s2mps11_ldo(num, step) {		\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
346
347
348
349
350
  	.name		= "LDO"#num,			\
  	.id		= S2MPS11_LDO##num,		\
  	.ops		= &s2mps11_ldo_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
94be46b9e   Krzysztof Kozlowski   regulator: s2mps1...
351
  	.ramp_delay	= RAMP_DELAY_12_MVUS,		\
0e4f41785   Amit Daniel Kachhap   regulator: s2mpxx...
352
  	.min_uV		= MIN_800_MV,			\
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
353
  	.uV_step	= step,				\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
354
355
  	.n_voltages	= S2MPS11_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPS11_REG_L1CTRL + num - 1,	\
2693fcab1   Axel Lin   regulator: s2mps1...
356
  	.vsel_mask	= S2MPS11_LDO_VSEL_MASK,	\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
357
358
359
  	.enable_reg	= S2MPS11_REG_L1CTRL + num - 1,	\
  	.enable_mask	= S2MPS11_ENABLE_MASK		\
  }
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
360
  #define regulator_desc_s2mps11_buck1_4(num) {			\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
361
362
363
364
365
  	.name		= "BUCK"#num,				\
  	.id		= S2MPS11_BUCK##num,			\
  	.ops		= &s2mps11_buck_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
366
  	.min_uV		= MIN_650_MV,				\
0e4f41785   Amit Daniel Kachhap   regulator: s2mpxx...
367
  	.uV_step	= STEP_6_25_MV,				\
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
368
369
  	.linear_min_sel	= 8,					\
  	.n_voltages	= S2MPS11_BUCK12346_N_VOLTAGES,		\
90068348b   Yadwinder Singh Brar   regulator: s2mps1...
370
  	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
371
  	.vsel_reg	= S2MPS11_REG_B1CTRL2 + (num - 1) * 2,	\
2693fcab1   Axel Lin   regulator: s2mps1...
372
  	.vsel_mask	= S2MPS11_BUCK_VSEL_MASK,		\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
373
374
375
  	.enable_reg	= S2MPS11_REG_B1CTRL1 + (num - 1) * 2,	\
  	.enable_mask	= S2MPS11_ENABLE_MASK			\
  }
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
376
  #define regulator_desc_s2mps11_buck5 {				\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
377
378
379
380
381
  	.name		= "BUCK5",				\
  	.id		= S2MPS11_BUCK5,			\
  	.ops		= &s2mps11_buck_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
382
  	.min_uV		= MIN_650_MV,				\
0e4f41785   Amit Daniel Kachhap   regulator: s2mpxx...
383
  	.uV_step	= STEP_6_25_MV,				\
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
384
385
  	.linear_min_sel	= 8,					\
  	.n_voltages	= S2MPS11_BUCK5_N_VOLTAGES,		\
90068348b   Yadwinder Singh Brar   regulator: s2mps1...
386
  	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
387
  	.vsel_reg	= S2MPS11_REG_B5CTRL2,			\
2693fcab1   Axel Lin   regulator: s2mps1...
388
  	.vsel_mask	= S2MPS11_BUCK_VSEL_MASK,		\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
389
390
391
  	.enable_reg	= S2MPS11_REG_B5CTRL1,			\
  	.enable_mask	= S2MPS11_ENABLE_MASK			\
  }
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
392
  #define regulator_desc_s2mps11_buck67810(num, min, step, min_sel, voltages) {	\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
393
394
395
396
397
  	.name		= "BUCK"#num,				\
  	.id		= S2MPS11_BUCK##num,			\
  	.ops		= &s2mps11_buck_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
398
399
  	.min_uV		= min,					\
  	.uV_step	= step,					\
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
400
401
  	.linear_min_sel	= min_sel,				\
  	.n_voltages	= voltages,				\
90068348b   Yadwinder Singh Brar   regulator: s2mps1...
402
  	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
403
  	.vsel_reg	= S2MPS11_REG_B6CTRL2 + (num - 6) * 2,	\
2693fcab1   Axel Lin   regulator: s2mps1...
404
  	.vsel_mask	= S2MPS11_BUCK_VSEL_MASK,		\
cb74685ec   Sangbeom Kim   regulator: s2mps1...
405
406
407
  	.enable_reg	= S2MPS11_REG_B6CTRL1 + (num - 6) * 2,	\
  	.enable_mask	= S2MPS11_ENABLE_MASK			\
  }
3b6726230   Krzysztof Kozlowski   regulator: s2mps1...
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
  #define regulator_desc_s2mps11_buck9 {				\
  	.name		= "BUCK9",				\
  	.id		= S2MPS11_BUCK9,			\
  	.ops		= &s2mps11_buck_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= MIN_3000_MV,				\
  	.uV_step	= STEP_25_MV,				\
  	.n_voltages	= S2MPS11_BUCK9_N_VOLTAGES,		\
  	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
  	.vsel_reg	= S2MPS11_REG_B9CTRL2,			\
  	.vsel_mask	= S2MPS11_BUCK9_VSEL_MASK,		\
  	.enable_reg	= S2MPS11_REG_B9CTRL1,			\
  	.enable_mask	= S2MPS11_ENABLE_MASK			\
  }
0f4cc2829   Krzysztof Kozlowski   regulator: s2mps1...
423
  static const struct regulator_desc s2mps11_regulators[] = {
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
424
425
426
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
  	regulator_desc_s2mps11_ldo(1, STEP_25_MV),
  	regulator_desc_s2mps11_ldo(2, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(3, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(4, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(5, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(6, STEP_25_MV),
  	regulator_desc_s2mps11_ldo(7, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(8, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(9, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(10, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(11, STEP_25_MV),
  	regulator_desc_s2mps11_ldo(12, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(13, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(14, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(15, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(16, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(17, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(18, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(19, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(20, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(21, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(22, STEP_25_MV),
  	regulator_desc_s2mps11_ldo(23, STEP_25_MV),
  	regulator_desc_s2mps11_ldo(24, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(25, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(26, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(27, STEP_25_MV),
  	regulator_desc_s2mps11_ldo(28, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(29, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(30, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(31, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(32, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(33, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(34, STEP_50_MV),
56b5d4ea7   Krzysztof Kozlowski   regulator: s2mps1...
458
  	regulator_desc_s2mps11_ldo(35, STEP_25_MV),
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
459
460
461
  	regulator_desc_s2mps11_ldo(36, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(37, STEP_50_MV),
  	regulator_desc_s2mps11_ldo(38, STEP_50_MV),
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
462
463
464
465
466
  	regulator_desc_s2mps11_buck1_4(1),
  	regulator_desc_s2mps11_buck1_4(2),
  	regulator_desc_s2mps11_buck1_4(3),
  	regulator_desc_s2mps11_buck1_4(4),
  	regulator_desc_s2mps11_buck5,
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
467
468
469
470
471
472
  	regulator_desc_s2mps11_buck67810(6, MIN_650_MV, STEP_6_25_MV, 8,
  					 S2MPS11_BUCK12346_N_VOLTAGES),
  	regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV, 0,
  					 S2MPS11_BUCK7810_N_VOLTAGES),
  	regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV, 0,
  					 S2MPS11_BUCK7810_N_VOLTAGES),
3b6726230   Krzysztof Kozlowski   regulator: s2mps1...
473
  	regulator_desc_s2mps11_buck9,
9d83dcb3e   Krzysztof Kozlowski   regulator: s2mps1...
474
475
  	regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV, 0,
  					 S2MPS11_BUCK7810_N_VOLTAGES),
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
476
  };
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
477
  static const struct regulator_ops s2mps14_reg_ops;
76b9840b2   Chanwoo Choi   regulator: s2mps1...
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
  
  #define regulator_desc_s2mps13_ldo(num, min, step, min_sel) {	\
  	.name		= "LDO"#num,				\
  	.id		= S2MPS13_LDO##num,			\
  	.ops		= &s2mps14_reg_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= min,					\
  	.uV_step	= step,					\
  	.linear_min_sel	= min_sel,				\
  	.n_voltages	= S2MPS14_LDO_N_VOLTAGES,		\
  	.vsel_reg	= S2MPS13_REG_L1CTRL + num - 1,		\
  	.vsel_mask	= S2MPS14_LDO_VSEL_MASK,		\
  	.enable_reg	= S2MPS13_REG_L1CTRL + num - 1,		\
  	.enable_mask	= S2MPS14_ENABLE_MASK			\
  }
  
  #define regulator_desc_s2mps13_buck(num, min, step, min_sel) {	\
  	.name		= "BUCK"#num,				\
  	.id		= S2MPS13_BUCK##num,			\
  	.ops		= &s2mps14_reg_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= min,					\
  	.uV_step	= step,					\
  	.linear_min_sel	= min_sel,				\
  	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
  	.ramp_delay	= S2MPS13_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPS13_REG_B1OUT + (num - 1) * 2,	\
  	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPS13_REG_B1CTRL + (num - 1) * 2,	\
  	.enable_mask	= S2MPS14_ENABLE_MASK			\
  }
ad26aa6c6   Jonghwa Lee   regulator: s2mps1...
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
  #define regulator_desc_s2mps13_buck7(num, min, step, min_sel) {	\
  	.name		= "BUCK"#num,				\
  	.id		= S2MPS13_BUCK##num,			\
  	.ops		= &s2mps14_reg_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= min,					\
  	.uV_step	= step,					\
  	.linear_min_sel	= min_sel,				\
  	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
  	.ramp_delay	= S2MPS13_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPS13_REG_B1OUT + (num) * 2 - 1,	\
  	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPS13_REG_B1CTRL + (num - 1) * 2,	\
  	.enable_mask	= S2MPS14_ENABLE_MASK			\
  }
  
  #define regulator_desc_s2mps13_buck8_10(num, min, step, min_sel) {	\
  	.name		= "BUCK"#num,				\
  	.id		= S2MPS13_BUCK##num,			\
  	.ops		= &s2mps14_reg_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= min,					\
  	.uV_step	= step,					\
  	.linear_min_sel	= min_sel,				\
  	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
  	.ramp_delay	= S2MPS13_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPS13_REG_B1OUT + (num) * 2 - 1,	\
  	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPS13_REG_B1CTRL + (num) * 2 - 1,	\
  	.enable_mask	= S2MPS14_ENABLE_MASK			\
  }
76b9840b2   Chanwoo Choi   regulator: s2mps1...
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
  static const struct regulator_desc s2mps13_regulators[] = {
  	regulator_desc_s2mps13_ldo(1,  MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(2,  MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(3,  MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(4,  MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(5,  MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(6,  MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(7,  MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(8,  MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(9,  MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(10, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(11, MIN_800_MV,  STEP_25_MV,   0x10),
  	regulator_desc_s2mps13_ldo(12, MIN_800_MV,  STEP_25_MV,   0x10),
  	regulator_desc_s2mps13_ldo(13, MIN_800_MV,  STEP_25_MV,   0x10),
  	regulator_desc_s2mps13_ldo(14, MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(15, MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(16, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(17, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(18, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(19, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(20, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(21, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(22, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(23, MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(24, MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(25, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(26, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(27, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(28, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(29, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(30, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(31, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(32, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(33, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(34, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(35, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(36, MIN_800_MV,  STEP_12_5_MV, 0x00),
  	regulator_desc_s2mps13_ldo(37, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(38, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_ldo(39, MIN_1000_MV, STEP_25_MV,   0x08),
  	regulator_desc_s2mps13_ldo(40, MIN_1400_MV, STEP_50_MV,   0x0C),
  	regulator_desc_s2mps13_buck(1,  MIN_500_MV,  STEP_6_25_MV, 0x10),
  	regulator_desc_s2mps13_buck(2,  MIN_500_MV,  STEP_6_25_MV, 0x10),
  	regulator_desc_s2mps13_buck(3,  MIN_500_MV,  STEP_6_25_MV, 0x10),
  	regulator_desc_s2mps13_buck(4,  MIN_500_MV,  STEP_6_25_MV, 0x10),
  	regulator_desc_s2mps13_buck(5,  MIN_500_MV,  STEP_6_25_MV, 0x10),
  	regulator_desc_s2mps13_buck(6,  MIN_500_MV,  STEP_6_25_MV, 0x10),
ad26aa6c6   Jonghwa Lee   regulator: s2mps1...
591
592
593
594
  	regulator_desc_s2mps13_buck7(7,  MIN_500_MV,  STEP_6_25_MV, 0x10),
  	regulator_desc_s2mps13_buck8_10(8,  MIN_1000_MV, STEP_12_5_MV, 0x20),
  	regulator_desc_s2mps13_buck8_10(9,  MIN_1000_MV, STEP_12_5_MV, 0x20),
  	regulator_desc_s2mps13_buck8_10(10, MIN_500_MV,  STEP_6_25_MV, 0x10),
76b9840b2   Chanwoo Choi   regulator: s2mps1...
595
  };
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
596
  static const struct regulator_ops s2mps14_reg_ops = {
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
597
598
599
  	.list_voltage		= regulator_list_voltage_linear,
  	.map_voltage		= regulator_map_voltage_linear,
  	.is_enabled		= regulator_is_enabled_regmap,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
600
  	.enable			= s2mps11_regulator_enable,
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
601
602
603
604
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
605
  	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
606
  };
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
607
  #define regulator_desc_s2mps14_ldo(num, min, step) {	\
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
608
609
610
611
612
  	.name		= "LDO"#num,			\
  	.id		= S2MPS14_LDO##num,		\
  	.ops		= &s2mps14_reg_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
613
614
  	.min_uV		= min,				\
  	.uV_step	= step,				\
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
615
616
617
618
619
620
  	.n_voltages	= S2MPS14_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPS14_REG_L1CTRL + num - 1,	\
  	.vsel_mask	= S2MPS14_LDO_VSEL_MASK,	\
  	.enable_reg	= S2MPS14_REG_L1CTRL + num - 1,	\
  	.enable_mask	= S2MPS14_ENABLE_MASK		\
  }
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
621

1222d8fe5   Krzysztof Kozlowski   regulator: s2mps1...
622
  #define regulator_desc_s2mps14_buck(num, min, step, min_sel) {	\
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
623
624
625
626
627
  	.name		= "BUCK"#num,				\
  	.id		= S2MPS14_BUCK##num,			\
  	.ops		= &s2mps14_reg_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
628
629
  	.min_uV		= min,					\
  	.uV_step	= step,					\
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
630
  	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
1222d8fe5   Krzysztof Kozlowski   regulator: s2mps1...
631
  	.linear_min_sel = min_sel,				\
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
632
633
634
635
636
637
  	.ramp_delay	= S2MPS14_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPS14_REG_B1CTRL2 + (num - 1) * 2,	\
  	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPS14_REG_B1CTRL1 + (num - 1) * 2,	\
  	.enable_mask	= S2MPS14_ENABLE_MASK			\
  }
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
638
639
  
  static const struct regulator_desc s2mps14_regulators[] = {
5a867cf28   Amit Daniel Kachhap   regulator: s2mps1...
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
  	regulator_desc_s2mps14_ldo(1, MIN_800_MV, STEP_12_5_MV),
  	regulator_desc_s2mps14_ldo(2, MIN_800_MV, STEP_12_5_MV),
  	regulator_desc_s2mps14_ldo(3, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(4, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(5, MIN_800_MV, STEP_12_5_MV),
  	regulator_desc_s2mps14_ldo(6, MIN_800_MV, STEP_12_5_MV),
  	regulator_desc_s2mps14_ldo(7, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(8, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(9, MIN_800_MV, STEP_12_5_MV),
  	regulator_desc_s2mps14_ldo(10, MIN_800_MV, STEP_12_5_MV),
  	regulator_desc_s2mps14_ldo(11, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(12, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(13, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(14, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(15, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(16, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(17, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(18, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(19, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(20, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(21, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(22, MIN_800_MV, STEP_12_5_MV),
  	regulator_desc_s2mps14_ldo(23, MIN_800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(24, MIN_1800_MV, STEP_25_MV),
  	regulator_desc_s2mps14_ldo(25, MIN_1800_MV, STEP_25_MV),
1222d8fe5   Krzysztof Kozlowski   regulator: s2mps1...
665
666
667
668
669
670
671
672
673
674
  	regulator_desc_s2mps14_buck(1, MIN_600_MV, STEP_6_25_MV,
  				    S2MPS14_BUCK1235_START_SEL),
  	regulator_desc_s2mps14_buck(2, MIN_600_MV, STEP_6_25_MV,
  				    S2MPS14_BUCK1235_START_SEL),
  	regulator_desc_s2mps14_buck(3, MIN_600_MV, STEP_6_25_MV,
  				    S2MPS14_BUCK1235_START_SEL),
  	regulator_desc_s2mps14_buck(4, MIN_1400_MV, STEP_12_5_MV,
  				    S2MPS14_BUCK4_START_SEL),
  	regulator_desc_s2mps14_buck(5, MIN_600_MV, STEP_6_25_MV,
  				    S2MPS14_BUCK1235_START_SEL),
cb74685ec   Sangbeom Kim   regulator: s2mps1...
675
  };
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
676
  static const struct regulator_ops s2mps15_reg_ldo_ops = {
51af20675   Thomas Abraham   regulator: s2mps1...
677
678
679
680
681
682
683
684
  	.list_voltage		= regulator_list_voltage_linear_range,
  	.map_voltage		= regulator_map_voltage_linear_range,
  	.is_enabled		= regulator_is_enabled_regmap,
  	.enable			= regulator_enable_regmap,
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  };
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
685
  static const struct regulator_ops s2mps15_reg_buck_ops = {
51af20675   Thomas Abraham   regulator: s2mps1...
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
  	.list_voltage		= regulator_list_voltage_linear_range,
  	.map_voltage		= regulator_map_voltage_linear_range,
  	.is_enabled		= regulator_is_enabled_regmap,
  	.enable			= regulator_enable_regmap,
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
  };
  
  #define regulator_desc_s2mps15_ldo(num, range) {	\
  	.name		= "LDO"#num,			\
  	.id		= S2MPS15_LDO##num,		\
  	.ops		= &s2mps15_reg_ldo_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
  	.linear_ranges	= range,			\
  	.n_linear_ranges = ARRAY_SIZE(range),		\
  	.n_voltages	= S2MPS15_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPS15_REG_L1CTRL + num - 1,	\
  	.vsel_mask	= S2MPS15_LDO_VSEL_MASK,	\
  	.enable_reg	= S2MPS15_REG_L1CTRL + num - 1,	\
  	.enable_mask	= S2MPS15_ENABLE_MASK		\
  }
  
  #define regulator_desc_s2mps15_buck(num, range) {			\
  	.name		= "BUCK"#num,					\
  	.id		= S2MPS15_BUCK##num,				\
  	.ops		= &s2mps15_reg_buck_ops,			\
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.linear_ranges	= range,					\
  	.n_linear_ranges = ARRAY_SIZE(range),				\
  	.ramp_delay	= 12500,					\
  	.n_voltages	= S2MPS15_BUCK_N_VOLTAGES,			\
  	.vsel_reg	= S2MPS15_REG_B1CTRL2 + ((num - 1) * 2),	\
  	.vsel_mask	= S2MPS15_BUCK_VSEL_MASK,			\
  	.enable_reg	= S2MPS15_REG_B1CTRL1 + ((num - 1) * 2),	\
  	.enable_mask	= S2MPS15_ENABLE_MASK				\
  }
  
  /* voltage range for s2mps15 LDO 3, 5, 15, 16, 18, 20, 23 and 27 */
60ab7f415   Matti Vaittinen   regulator: use li...
728
  static const struct linear_range s2mps15_ldo_voltage_ranges1[] = {
51af20675   Thomas Abraham   regulator: s2mps1...
729
730
731
732
  	REGULATOR_LINEAR_RANGE(1000000, 0xc, 0x38, 25000),
  };
  
  /* voltage range for s2mps15 LDO 2, 6, 14, 17, 19, 21, 24 and 25 */
60ab7f415   Matti Vaittinen   regulator: use li...
733
  static const struct linear_range s2mps15_ldo_voltage_ranges2[] = {
51af20675   Thomas Abraham   regulator: s2mps1...
734
735
736
737
  	REGULATOR_LINEAR_RANGE(1800000, 0x0, 0x3f, 25000),
  };
  
  /* voltage range for s2mps15 LDO 4, 11, 12, 13, 22 and 26 */
60ab7f415   Matti Vaittinen   regulator: use li...
738
  static const struct linear_range s2mps15_ldo_voltage_ranges3[] = {
51af20675   Thomas Abraham   regulator: s2mps1...
739
740
741
742
  	REGULATOR_LINEAR_RANGE(700000, 0x0, 0x34, 12500),
  };
  
  /* voltage range for s2mps15 LDO 7, 8, 9 and 10 */
60ab7f415   Matti Vaittinen   regulator: use li...
743
  static const struct linear_range s2mps15_ldo_voltage_ranges4[] = {
04c16b84e   Alim Akhtar   regulator: s2mps1...
744
  	REGULATOR_LINEAR_RANGE(700000, 0x10, 0x20, 25000),
51af20675   Thomas Abraham   regulator: s2mps1...
745
746
747
  };
  
  /* voltage range for s2mps15 LDO 1 */
60ab7f415   Matti Vaittinen   regulator: use li...
748
  static const struct linear_range s2mps15_ldo_voltage_ranges5[] = {
51af20675   Thomas Abraham   regulator: s2mps1...
749
750
751
752
  	REGULATOR_LINEAR_RANGE(500000, 0x0, 0x20, 12500),
  };
  
  /* voltage range for s2mps15 BUCK 1, 2, 3, 4, 5, 6 and 7 */
60ab7f415   Matti Vaittinen   regulator: use li...
753
  static const struct linear_range s2mps15_buck_voltage_ranges1[] = {
04c16b84e   Alim Akhtar   regulator: s2mps1...
754
  	REGULATOR_LINEAR_RANGE(500000, 0x20, 0xc0, 6250),
51af20675   Thomas Abraham   regulator: s2mps1...
755
756
757
  };
  
  /* voltage range for s2mps15 BUCK 8, 9 and 10 */
60ab7f415   Matti Vaittinen   regulator: use li...
758
  static const struct linear_range s2mps15_buck_voltage_ranges2[] = {
04c16b84e   Alim Akhtar   regulator: s2mps1...
759
  	REGULATOR_LINEAR_RANGE(1000000, 0x20, 0x78, 12500),
51af20675   Thomas Abraham   regulator: s2mps1...
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
  };
  
  static const struct regulator_desc s2mps15_regulators[] = {
  	regulator_desc_s2mps15_ldo(1, s2mps15_ldo_voltage_ranges5),
  	regulator_desc_s2mps15_ldo(2, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(3, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_ldo(4, s2mps15_ldo_voltage_ranges3),
  	regulator_desc_s2mps15_ldo(5, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_ldo(6, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(7, s2mps15_ldo_voltage_ranges4),
  	regulator_desc_s2mps15_ldo(8, s2mps15_ldo_voltage_ranges4),
  	regulator_desc_s2mps15_ldo(9, s2mps15_ldo_voltage_ranges4),
  	regulator_desc_s2mps15_ldo(10, s2mps15_ldo_voltage_ranges4),
  	regulator_desc_s2mps15_ldo(11, s2mps15_ldo_voltage_ranges3),
  	regulator_desc_s2mps15_ldo(12, s2mps15_ldo_voltage_ranges3),
  	regulator_desc_s2mps15_ldo(13, s2mps15_ldo_voltage_ranges3),
  	regulator_desc_s2mps15_ldo(14, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(15, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_ldo(16, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_ldo(17, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(18, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_ldo(19, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(20, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_ldo(21, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(22, s2mps15_ldo_voltage_ranges3),
  	regulator_desc_s2mps15_ldo(23, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_ldo(24, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(25, s2mps15_ldo_voltage_ranges2),
  	regulator_desc_s2mps15_ldo(26, s2mps15_ldo_voltage_ranges3),
  	regulator_desc_s2mps15_ldo(27, s2mps15_ldo_voltage_ranges1),
  	regulator_desc_s2mps15_buck(1, s2mps15_buck_voltage_ranges1),
  	regulator_desc_s2mps15_buck(2, s2mps15_buck_voltage_ranges1),
  	regulator_desc_s2mps15_buck(3, s2mps15_buck_voltage_ranges1),
  	regulator_desc_s2mps15_buck(4, s2mps15_buck_voltage_ranges1),
  	regulator_desc_s2mps15_buck(5, s2mps15_buck_voltage_ranges1),
  	regulator_desc_s2mps15_buck(6, s2mps15_buck_voltage_ranges1),
  	regulator_desc_s2mps15_buck(7, s2mps15_buck_voltage_ranges1),
  	regulator_desc_s2mps15_buck(8, s2mps15_buck_voltage_ranges2),
  	regulator_desc_s2mps15_buck(9, s2mps15_buck_voltage_ranges2),
  	regulator_desc_s2mps15_buck(10, s2mps15_buck_voltage_ranges2),
  };
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
801
802
803
804
805
806
807
808
  static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
  		struct regulator_dev *rdev)
  {
  	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  			rdev->desc->enable_mask, S2MPS14_ENABLE_EXT_CONTROL);
  }
  
  static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
011703835   Krzysztof Kozlowski   regulator: s2mps1...
809
810
  		struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
  {
1c984942f   Linus Walleij   regulator: s2mps1...
811
  	struct gpio_desc **gpio = s2mps11->ext_control_gpiod;
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
812
813
814
815
816
817
818
819
820
  	unsigned int i;
  	unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,
  		S2MPS14_LDO12 };
  
  	for (i = 0; i < ARRAY_SIZE(valid_regulators); i++) {
  		unsigned int reg = valid_regulators[i];
  
  		if (!rdata[reg].init_data || !rdata[reg].of_node)
  			continue;
de2792b50   Dmitry Torokhov   regulator: s2mps1...
821
822
823
  		gpio[reg] = devm_fwnode_gpiod_get(&pdev->dev,
  				of_fwnode_handle(rdata[reg].of_node),
  				"samsung,ext-control",
1c984942f   Linus Walleij   regulator: s2mps1...
824
825
  				GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
  				"s2mps11-regulator");
025bf3772   Waibel Georg   gpio: Fix return ...
826
827
828
  		if (PTR_ERR(gpio[reg]) == -ENOENT)
  			gpio[reg] = NULL;
  		else if (IS_ERR(gpio[reg])) {
1c984942f   Linus Walleij   regulator: s2mps1...
829
830
831
  			dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s
  ",
  				reg, rdata[reg].name);
70ca117b0   Krzysztof Kozlowski   regulator: s2mps1...
832
  			gpio[reg] = NULL;
1c984942f   Linus Walleij   regulator: s2mps1...
833
834
835
836
837
838
  			continue;
  		}
  		if (gpio[reg])
  			dev_dbg(&pdev->dev, "Using GPIO for ext-control over %d/%s
  ",
  				reg, rdata[reg].name);
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
839
840
841
842
  	}
  }
  
  static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
843
844
  		struct of_regulator_match *rdata, struct s2mps11_info *s2mps11,
  		unsigned int rdev_num)
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
845
  {
011703835   Krzysztof Kozlowski   regulator: s2mps1...
846
847
848
849
850
851
852
853
  	struct device_node *reg_np;
  
  	reg_np = of_get_child_by_name(pdev->dev.parent->of_node, "regulators");
  	if (!reg_np) {
  		dev_err(&pdev->dev, "could not find regulators sub-node
  ");
  		return -EINVAL;
  	}
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
854
  	of_regulator_match(&pdev->dev, reg_np, rdata, rdev_num);
00e2573d2   Chanwoo Choi   regulator: s2mps1...
855
  	if (s2mps11->dev_type == S2MPS14X)
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
856
  		s2mps14_pmic_dt_parse_ext_control_gpio(pdev, rdata, s2mps11);
011703835   Krzysztof Kozlowski   regulator: s2mps1...
857
858
859
860
  	of_node_put(reg_np);
  
  	return 0;
  }
00e2573d2   Chanwoo Choi   regulator: s2mps1...
861
862
863
  static int s2mpu02_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
  {
  	unsigned int ramp_val, ramp_shift, ramp_reg;
df33799c5   Krzysztof Kozlowski   regulator: s2mps1...
864
  	int rdev_id = rdev_get_id(rdev);
00e2573d2   Chanwoo Choi   regulator: s2mps1...
865

df33799c5   Krzysztof Kozlowski   regulator: s2mps1...
866
  	switch (rdev_id) {
00e2573d2   Chanwoo Choi   regulator: s2mps1...
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
  	case S2MPU02_BUCK1:
  		ramp_shift = S2MPU02_BUCK1_RAMP_SHIFT;
  		break;
  	case S2MPU02_BUCK2:
  		ramp_shift = S2MPU02_BUCK2_RAMP_SHIFT;
  		break;
  	case S2MPU02_BUCK3:
  		ramp_shift = S2MPU02_BUCK3_RAMP_SHIFT;
  		break;
  	case S2MPU02_BUCK4:
  		ramp_shift = S2MPU02_BUCK4_RAMP_SHIFT;
  		break;
  	default:
  		return 0;
  	}
  	ramp_reg = S2MPU02_REG_RAMP1;
  	ramp_val = get_ramp_delay(ramp_delay);
  
  	return regmap_update_bits(rdev->regmap, ramp_reg,
  				  S2MPU02_BUCK1234_RAMP_MASK << ramp_shift,
  				  ramp_val << ramp_shift);
  }
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
889
  static const struct regulator_ops s2mpu02_ldo_ops = {
00e2573d2   Chanwoo Choi   regulator: s2mps1...
890
891
892
  	.list_voltage		= regulator_list_voltage_linear,
  	.map_voltage		= regulator_map_voltage_linear,
  	.is_enabled		= regulator_is_enabled_regmap,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
893
  	.enable			= s2mps11_regulator_enable,
00e2573d2   Chanwoo Choi   regulator: s2mps1...
894
895
896
897
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
898
  	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
00e2573d2   Chanwoo Choi   regulator: s2mps1...
899
  };
71b4540f6   Krzysztof Kozlowski   regulator: s2mps1...
900
  static const struct regulator_ops s2mpu02_buck_ops = {
00e2573d2   Chanwoo Choi   regulator: s2mps1...
901
902
903
  	.list_voltage		= regulator_list_voltage_linear,
  	.map_voltage		= regulator_map_voltage_linear,
  	.is_enabled		= regulator_is_enabled_regmap,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
904
  	.enable			= s2mps11_regulator_enable,
00e2573d2   Chanwoo Choi   regulator: s2mps1...
905
906
907
908
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
65d80db2e   Krzysztof Kozlowski   regulator: s2mps1...
909
  	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
00e2573d2   Chanwoo Choi   regulator: s2mps1...
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
  	.set_ramp_delay		= s2mpu02_set_ramp_delay,
  };
  
  #define regulator_desc_s2mpu02_ldo1(num) {		\
  	.name		= "LDO"#num,			\
  	.id		= S2MPU02_LDO##num,		\
  	.ops		= &s2mpu02_ldo_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
  	.min_uV		= S2MPU02_LDO_MIN_900MV,	\
  	.uV_step	= S2MPU02_LDO_STEP_12_5MV,	\
  	.linear_min_sel	= S2MPU02_LDO_GROUP1_START_SEL,	\
  	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPU02_REG_L1CTRL,		\
  	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
  	.enable_reg	= S2MPU02_REG_L1CTRL,		\
  	.enable_mask	= S2MPU02_ENABLE_MASK		\
  }
  #define regulator_desc_s2mpu02_ldo2(num) {		\
  	.name		= "LDO"#num,			\
  	.id		= S2MPU02_LDO##num,		\
  	.ops		= &s2mpu02_ldo_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
  	.min_uV		= S2MPU02_LDO_MIN_1050MV,	\
  	.uV_step	= S2MPU02_LDO_STEP_25MV,	\
  	.linear_min_sel	= S2MPU02_LDO_GROUP2_START_SEL,	\
  	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPU02_REG_L2CTRL1,		\
  	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
  	.enable_reg	= S2MPU02_REG_L2CTRL1,		\
  	.enable_mask	= S2MPU02_ENABLE_MASK		\
  }
  #define regulator_desc_s2mpu02_ldo3(num) {		\
  	.name		= "LDO"#num,			\
  	.id		= S2MPU02_LDO##num,		\
  	.ops		= &s2mpu02_ldo_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
  	.min_uV		= S2MPU02_LDO_MIN_900MV,	\
  	.uV_step	= S2MPU02_LDO_STEP_12_5MV,	\
  	.linear_min_sel	= S2MPU02_LDO_GROUP1_START_SEL,	\
  	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
  	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
  	.enable_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
  	.enable_mask	= S2MPU02_ENABLE_MASK		\
  }
  #define regulator_desc_s2mpu02_ldo4(num) {		\
  	.name		= "LDO"#num,			\
  	.id		= S2MPU02_LDO##num,		\
  	.ops		= &s2mpu02_ldo_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
  	.min_uV		= S2MPU02_LDO_MIN_1050MV,	\
  	.uV_step	= S2MPU02_LDO_STEP_25MV,	\
  	.linear_min_sel	= S2MPU02_LDO_GROUP2_START_SEL,	\
  	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
  	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
  	.enable_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
  	.enable_mask	= S2MPU02_ENABLE_MASK		\
  }
  #define regulator_desc_s2mpu02_ldo5(num) {		\
  	.name		= "LDO"#num,			\
  	.id		= S2MPU02_LDO##num,		\
  	.ops		= &s2mpu02_ldo_ops,		\
  	.type		= REGULATOR_VOLTAGE,		\
  	.owner		= THIS_MODULE,			\
  	.min_uV		= S2MPU02_LDO_MIN_1600MV,	\
  	.uV_step	= S2MPU02_LDO_STEP_50MV,	\
  	.linear_min_sel	= S2MPU02_LDO_GROUP3_START_SEL,	\
  	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
  	.vsel_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
  	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
  	.enable_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
  	.enable_mask	= S2MPU02_ENABLE_MASK		\
  }
  
  #define regulator_desc_s2mpu02_buck1234(num) {			\
  	.name		= "BUCK"#num,				\
  	.id		= S2MPU02_BUCK##num,			\
  	.ops		= &s2mpu02_buck_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= S2MPU02_BUCK1234_MIN_600MV,		\
  	.uV_step	= S2MPU02_BUCK1234_STEP_6_25MV,		\
  	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
  	.linear_min_sel = S2MPU02_BUCK1234_START_SEL,		\
  	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPU02_REG_B1CTRL2 + (num - 1) * 2,	\
  	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPU02_REG_B1CTRL1 + (num - 1) * 2,	\
  	.enable_mask	= S2MPU02_ENABLE_MASK			\
  }
  #define regulator_desc_s2mpu02_buck5(num) {			\
  	.name		= "BUCK"#num,				\
  	.id		= S2MPU02_BUCK##num,			\
  	.ops		= &s2mpu02_ldo_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= S2MPU02_BUCK5_MIN_1081_25MV,		\
  	.uV_step	= S2MPU02_BUCK5_STEP_6_25MV,		\
  	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
  	.linear_min_sel = S2MPU02_BUCK5_START_SEL,		\
  	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPU02_REG_B5CTRL2,			\
  	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPU02_REG_B5CTRL1,			\
  	.enable_mask	= S2MPU02_ENABLE_MASK			\
  }
  #define regulator_desc_s2mpu02_buck6(num) {			\
  	.name		= "BUCK"#num,				\
  	.id		= S2MPU02_BUCK##num,			\
  	.ops		= &s2mpu02_ldo_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= S2MPU02_BUCK6_MIN_1700MV,		\
  	.uV_step	= S2MPU02_BUCK6_STEP_2_50MV,		\
  	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
  	.linear_min_sel = S2MPU02_BUCK6_START_SEL,		\
  	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPU02_REG_B6CTRL2,			\
  	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPU02_REG_B6CTRL1,			\
  	.enable_mask	= S2MPU02_ENABLE_MASK			\
  }
  #define regulator_desc_s2mpu02_buck7(num) {			\
  	.name		= "BUCK"#num,				\
  	.id		= S2MPU02_BUCK##num,			\
  	.ops		= &s2mpu02_ldo_ops,			\
  	.type		= REGULATOR_VOLTAGE,			\
  	.owner		= THIS_MODULE,				\
  	.min_uV		= S2MPU02_BUCK7_MIN_900MV,		\
  	.uV_step	= S2MPU02_BUCK7_STEP_6_25MV,		\
  	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
  	.linear_min_sel = S2MPU02_BUCK7_START_SEL,		\
  	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
  	.vsel_reg	= S2MPU02_REG_B7CTRL2,			\
  	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
  	.enable_reg	= S2MPU02_REG_B7CTRL1,			\
  	.enable_mask	= S2MPU02_ENABLE_MASK			\
  }
  
  static const struct regulator_desc s2mpu02_regulators[] = {
  	regulator_desc_s2mpu02_ldo1(1),
  	regulator_desc_s2mpu02_ldo2(2),
  	regulator_desc_s2mpu02_ldo4(3),
  	regulator_desc_s2mpu02_ldo5(4),
  	regulator_desc_s2mpu02_ldo4(5),
  	regulator_desc_s2mpu02_ldo3(6),
  	regulator_desc_s2mpu02_ldo3(7),
  	regulator_desc_s2mpu02_ldo4(8),
  	regulator_desc_s2mpu02_ldo5(9),
  	regulator_desc_s2mpu02_ldo3(10),
  	regulator_desc_s2mpu02_ldo4(11),
  	regulator_desc_s2mpu02_ldo5(12),
  	regulator_desc_s2mpu02_ldo5(13),
  	regulator_desc_s2mpu02_ldo5(14),
  	regulator_desc_s2mpu02_ldo5(15),
  	regulator_desc_s2mpu02_ldo5(16),
  	regulator_desc_s2mpu02_ldo4(17),
  	regulator_desc_s2mpu02_ldo5(18),
  	regulator_desc_s2mpu02_ldo3(19),
  	regulator_desc_s2mpu02_ldo4(20),
  	regulator_desc_s2mpu02_ldo5(21),
  	regulator_desc_s2mpu02_ldo5(22),
  	regulator_desc_s2mpu02_ldo5(23),
  	regulator_desc_s2mpu02_ldo4(24),
  	regulator_desc_s2mpu02_ldo5(25),
  	regulator_desc_s2mpu02_ldo4(26),
  	regulator_desc_s2mpu02_ldo5(27),
  	regulator_desc_s2mpu02_ldo5(28),
  	regulator_desc_s2mpu02_buck1234(1),
  	regulator_desc_s2mpu02_buck1234(2),
  	regulator_desc_s2mpu02_buck1234(3),
  	regulator_desc_s2mpu02_buck1234(4),
  	regulator_desc_s2mpu02_buck5(5),
  	regulator_desc_s2mpu02_buck6(6),
  	regulator_desc_s2mpu02_buck7(7),
  };
a5023574d   Bill Pemberton   regulator: remove...
1091
  static int s2mps11_pmic_probe(struct platform_device *pdev)
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1092
1093
  {
  	struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
011703835   Krzysztof Kozlowski   regulator: s2mps1...
1094
  	struct sec_platform_data *pdata = NULL;
3e80f95bf   Krzysztof Kozlowski   regulator: s2mps1...
1095
  	struct of_regulator_match *rdata = NULL;
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1096
  	struct regulator_config config = { };
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1097
  	struct s2mps11_info *s2mps11;
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1098
  	unsigned int rdev_num = 0;
3e80f95bf   Krzysztof Kozlowski   regulator: s2mps1...
1099
  	int i, ret = 0;
0f4cc2829   Krzysztof Kozlowski   regulator: s2mps1...
1100
  	const struct regulator_desc *regulators;
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1101

cb74685ec   Sangbeom Kim   regulator: s2mps1...
1102
1103
1104
1105
  	s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
  				GFP_KERNEL);
  	if (!s2mps11)
  		return -ENOMEM;
00e2573d2   Chanwoo Choi   regulator: s2mps1...
1106
1107
  	s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
  	switch (s2mps11->dev_type) {
0f4cc2829   Krzysztof Kozlowski   regulator: s2mps1...
1108
  	case S2MPS11X:
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1109
  		rdev_num = ARRAY_SIZE(s2mps11_regulators);
0f4cc2829   Krzysztof Kozlowski   regulator: s2mps1...
1110
  		regulators = s2mps11_regulators;
297eaaa6d   Krzysztof Kozlowski   regulator: s2mps1...
1111
  		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps11_regulators));
0f4cc2829   Krzysztof Kozlowski   regulator: s2mps1...
1112
  		break;
76b9840b2   Chanwoo Choi   regulator: s2mps1...
1113
  	case S2MPS13X:
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1114
  		rdev_num = ARRAY_SIZE(s2mps13_regulators);
76b9840b2   Chanwoo Choi   regulator: s2mps1...
1115
  		regulators = s2mps13_regulators;
297eaaa6d   Krzysztof Kozlowski   regulator: s2mps1...
1116
  		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps13_regulators));
76b9840b2   Chanwoo Choi   regulator: s2mps1...
1117
  		break;
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
1118
  	case S2MPS14X:
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1119
  		rdev_num = ARRAY_SIZE(s2mps14_regulators);
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
1120
  		regulators = s2mps14_regulators;
297eaaa6d   Krzysztof Kozlowski   regulator: s2mps1...
1121
  		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps14_regulators));
15f77300c   Krzysztof Kozlowski   regulator: s2mps1...
1122
  		break;
51af20675   Thomas Abraham   regulator: s2mps1...
1123
  	case S2MPS15X:
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1124
  		rdev_num = ARRAY_SIZE(s2mps15_regulators);
51af20675   Thomas Abraham   regulator: s2mps1...
1125
  		regulators = s2mps15_regulators;
297eaaa6d   Krzysztof Kozlowski   regulator: s2mps1...
1126
  		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps15_regulators));
51af20675   Thomas Abraham   regulator: s2mps1...
1127
  		break;
00e2573d2   Chanwoo Choi   regulator: s2mps1...
1128
  	case S2MPU02:
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1129
  		rdev_num = ARRAY_SIZE(s2mpu02_regulators);
00e2573d2   Chanwoo Choi   regulator: s2mps1...
1130
  		regulators = s2mpu02_regulators;
297eaaa6d   Krzysztof Kozlowski   regulator: s2mps1...
1131
  		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu02_regulators));
00e2573d2   Chanwoo Choi   regulator: s2mps1...
1132
  		break;
0f4cc2829   Krzysztof Kozlowski   regulator: s2mps1...
1133
  	default:
00e2573d2   Chanwoo Choi   regulator: s2mps1...
1134
1135
1136
  		dev_err(&pdev->dev, "Invalid device type: %u
  ",
  				    s2mps11->dev_type);
0f4cc2829   Krzysztof Kozlowski   regulator: s2mps1...
1137
  		return -EINVAL;
7cf225b98   Krzysztof Kozlowski   regulator: Remove...
1138
  	}
3e80f95bf   Krzysztof Kozlowski   regulator: s2mps1...
1139

d7c7fc442   Marek Szyprowski   regulator: s2mps1...
1140
1141
  	s2mps11->ext_control_gpiod = devm_kcalloc(&pdev->dev, rdev_num,
  			       sizeof(*s2mps11->ext_control_gpiod), GFP_KERNEL);
1c984942f   Linus Walleij   regulator: s2mps1...
1142
  	if (!s2mps11->ext_control_gpiod)
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
1143
  		return -ENOMEM;
6c683c929   Yadwinder Singh Brar   regulator: s2mps1...
1144
  	if (!iodev->dev->of_node) {
011703835   Krzysztof Kozlowski   regulator: s2mps1...
1145
1146
  		if (iodev->pdata) {
  			pdata = iodev->pdata;
6c683c929   Yadwinder Singh Brar   regulator: s2mps1...
1147
1148
1149
1150
1151
1152
1153
1154
  			goto common_reg;
  		} else {
  			dev_err(pdev->dev.parent,
  				"Platform data or DT node not supplied
  ");
  			return -ENODEV;
  		}
  	}
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1155

6396bb221   Kees Cook   treewide: kzalloc...
1156
  	rdata = kcalloc(rdev_num, sizeof(*rdata), GFP_KERNEL);
3e80f95bf   Krzysztof Kozlowski   regulator: s2mps1...
1157
1158
  	if (!rdata)
  		return -ENOMEM;
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1159
  	for (i = 0; i < rdev_num; i++)
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1160
  		rdata[i].name = regulators[i].name;
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1161
  	ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11, rdev_num);
011703835   Krzysztof Kozlowski   regulator: s2mps1...
1162
  	if (ret)
3e80f95bf   Krzysztof Kozlowski   regulator: s2mps1...
1163
  		goto out;
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1164

a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1165
1166
  common_reg:
  	platform_set_drvdata(pdev, s2mps11);
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1167

a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1168
  	config.dev = &pdev->dev;
1b1ccee1e   Krzysztof Kozlowski   mfd: s2mps11: Fix...
1169
  	config.regmap = iodev->regmap_pmic;
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1170
  	config.driver_data = s2mps11;
7ddec6412   Krzysztof Kozlowski   regulator: s2mps1...
1171
  	for (i = 0; i < rdev_num; i++) {
311952520   Krzysztof Kozlowski   regulator: s2mps1...
1172
  		struct regulator_dev *regulator;
011703835   Krzysztof Kozlowski   regulator: s2mps1...
1173
  		if (pdata) {
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1174
  			config.init_data = pdata->regulators[i].initdata;
54820f580   Krzysztof Kozlowski   regulator: s2mps1...
1175
  			config.of_node = pdata->regulators[i].reg_node;
a50c6b325   Yadwinder Singh Brar   regulator: s2mps1...
1176
1177
1178
1179
  		} else {
  			config.init_data = rdata[i].init_data;
  			config.of_node = rdata[i].of_node;
  		}
1c984942f   Linus Walleij   regulator: s2mps1...
1180
  		config.ena_gpiod = s2mps11->ext_control_gpiod[i];
2b96edb57   Linus Walleij   regulator: s2mps1...
1181
1182
1183
1184
1185
1186
  		/*
  		 * Hand the GPIO descriptor management over to the regulator
  		 * core, remove it from devres management.
  		 */
  		if (config.ena_gpiod)
  			devm_gpiod_unhinge(&pdev->dev, config.ena_gpiod);
311952520   Krzysztof Kozlowski   regulator: s2mps1...
1187
  		regulator = devm_regulator_register(&pdev->dev,
d55cd794d   Sachin Kamat   regulator: s2mps1...
1188
  						&regulators[i], &config);
311952520   Krzysztof Kozlowski   regulator: s2mps1...
1189
1190
  		if (IS_ERR(regulator)) {
  			ret = PTR_ERR(regulator);
232b25047   Axel Lin   regulator: s2mps1...
1191
1192
1193
  			dev_err(&pdev->dev, "regulator init failed for %d
  ",
  				i);
3e80f95bf   Krzysztof Kozlowski   regulator: s2mps1...
1194
  			goto out;
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1195
  		}
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
1196

d57d90f44   Krzysztof Kozlowski   regulator: s2mps1...
1197
  		if (config.ena_gpiod) {
97f53d710   Krzysztof Kozlowski   regulator: s2mps1...
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
  			ret = s2mps14_pmic_enable_ext_control(s2mps11,
  					regulator);
  			if (ret < 0) {
  				dev_err(&pdev->dev,
  						"failed to enable GPIO control over %s: %d
  ",
  						regulator->desc->name, ret);
  				goto out;
  			}
  		}
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1208
  	}
3e80f95bf   Krzysztof Kozlowski   regulator: s2mps1...
1209
1210
1211
1212
  out:
  	kfree(rdata);
  
  	return ret;
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1213
1214
1215
  }
  
  static const struct platform_device_id s2mps11_pmic_id[] = {
2fadbbf02   Alim Akhtar   mfd: sec-core: Re...
1216
1217
1218
  	{ "s2mps11-regulator", S2MPS11X},
  	{ "s2mps13-regulator", S2MPS13X},
  	{ "s2mps14-regulator", S2MPS14X},
51af20675   Thomas Abraham   regulator: s2mps1...
1219
  	{ "s2mps15-regulator", S2MPS15X},
2fadbbf02   Alim Akhtar   mfd: sec-core: Re...
1220
  	{ "s2mpu02-regulator", S2MPU02},
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1221
1222
1223
1224
1225
1226
1227
  	{ },
  };
  MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
  
  static struct platform_driver s2mps11_pmic_driver = {
  	.driver = {
  		.name = "s2mps11-pmic",
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1228
1229
  	},
  	.probe = s2mps11_pmic_probe,
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1230
1231
  	.id_table = s2mps11_pmic_id,
  };
5ab3c4949   Javier Martinez Canillas   regulator: s2mps1...
1232
  module_platform_driver(s2mps11_pmic_driver);
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1233
1234
1235
  
  /* Module information */
  MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
fc2b10d13   Krzysztof Kozlowski   regulator: samsun...
1236
  MODULE_DESCRIPTION("Samsung S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver");
cb74685ec   Sangbeom Kim   regulator: s2mps1...
1237
  MODULE_LICENSE("GPL");