• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2018 ROHM Semiconductors
3 // bd71837-regulator.c ROHM BD71837MWV/BD71847MWV regulator driver
4 
5 #include <linux/delay.h>
6 #include <linux/err.h>
7 #include <linux/interrupt.h>
8 #include <linux/kernel.h>
9 #include <linux/mfd/rohm-bd718x7.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/platform_device.h>
13 #include <linux/regulator/driver.h>
14 #include <linux/regulator/machine.h>
15 #include <linux/regulator/of_regulator.h>
16 #include <linux/slab.h>
17 
18 /*
19  * BUCK1/2/3/4
20  * BUCK1RAMPRATE[1:0] BUCK1 DVS ramp rate setting
21  * 00: 10.00mV/usec 10mV 1uS
22  * 01: 5.00mV/usec	10mV 2uS
23  * 10: 2.50mV/usec	10mV 4uS
24  * 11: 1.25mV/usec	10mV 8uS
25  */
bd718xx_buck1234_set_ramp_delay(struct regulator_dev * rdev,int ramp_delay)26 static int bd718xx_buck1234_set_ramp_delay(struct regulator_dev *rdev,
27 					   int ramp_delay)
28 {
29 	int id = rdev_get_id(rdev);
30 	unsigned int ramp_value;
31 
32 	dev_dbg(&rdev->dev, "Buck[%d] Set Ramp = %d\n", id + 1,
33 		ramp_delay);
34 	switch (ramp_delay) {
35 	case 1 ... 1250:
36 		ramp_value = BUCK_RAMPRATE_1P25MV;
37 		break;
38 	case 1251 ... 2500:
39 		ramp_value = BUCK_RAMPRATE_2P50MV;
40 		break;
41 	case 2501 ... 5000:
42 		ramp_value = BUCK_RAMPRATE_5P00MV;
43 		break;
44 	case 5001 ... 10000:
45 		ramp_value = BUCK_RAMPRATE_10P00MV;
46 		break;
47 	default:
48 		ramp_value = BUCK_RAMPRATE_10P00MV;
49 		dev_err(&rdev->dev,
50 			"%s: ramp_delay: %d not supported, setting 10000mV//us\n",
51 			rdev->desc->name, ramp_delay);
52 	}
53 
54 	return regmap_update_bits(rdev->regmap, BD718XX_REG_BUCK1_CTRL + id,
55 				  BUCK_RAMPRATE_MASK, ramp_value << 6);
56 }
57 
58 /* Bucks 1 to 4 support DVS. PWM mode is used when voltage is changed.
59  * Bucks 5 to 8 and LDOs can use PFM and must be disabled when voltage
60  * is changed. Hence we return -EBUSY for these if voltage is changed
61  * when BUCK/LDO is enabled.
62  */
bd718xx_set_voltage_sel_restricted(struct regulator_dev * rdev,unsigned int sel)63 static int bd718xx_set_voltage_sel_restricted(struct regulator_dev *rdev,
64 						    unsigned int sel)
65 {
66 	if (regulator_is_enabled_regmap(rdev))
67 		return -EBUSY;
68 
69 	return regulator_set_voltage_sel_regmap(rdev, sel);
70 }
71 
bd718xx_set_voltage_sel_pickable_restricted(struct regulator_dev * rdev,unsigned int sel)72 static int bd718xx_set_voltage_sel_pickable_restricted(
73 		struct regulator_dev *rdev, unsigned int sel)
74 {
75 	if (regulator_is_enabled_regmap(rdev))
76 		return -EBUSY;
77 
78 	return regulator_set_voltage_sel_pickable_regmap(rdev, sel);
79 }
80 
81 static const struct regulator_ops bd718xx_pickable_range_ldo_ops = {
82 	.enable = regulator_enable_regmap,
83 	.disable = regulator_disable_regmap,
84 	.is_enabled = regulator_is_enabled_regmap,
85 	.list_voltage = regulator_list_voltage_pickable_linear_range,
86 	.set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
87 	.get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
88 };
89 
90 static const struct regulator_ops bd718xx_pickable_range_buck_ops = {
91 	.enable = regulator_enable_regmap,
92 	.disable = regulator_disable_regmap,
93 	.is_enabled = regulator_is_enabled_regmap,
94 	.list_voltage = regulator_list_voltage_pickable_linear_range,
95 	.set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
96 	.get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
97 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
98 };
99 
100 static const struct regulator_ops bd718xx_ldo_regulator_ops = {
101 	.enable = regulator_enable_regmap,
102 	.disable = regulator_disable_regmap,
103 	.is_enabled = regulator_is_enabled_regmap,
104 	.list_voltage = regulator_list_voltage_linear_range,
105 	.set_voltage_sel = bd718xx_set_voltage_sel_restricted,
106 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
107 };
108 
109 static const struct regulator_ops bd718xx_ldo_regulator_nolinear_ops = {
110 	.enable = regulator_enable_regmap,
111 	.disable = regulator_disable_regmap,
112 	.is_enabled = regulator_is_enabled_regmap,
113 	.list_voltage = regulator_list_voltage_table,
114 	.set_voltage_sel = bd718xx_set_voltage_sel_restricted,
115 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
116 };
117 
118 static const struct regulator_ops bd718xx_buck_regulator_ops = {
119 	.enable = regulator_enable_regmap,
120 	.disable = regulator_disable_regmap,
121 	.is_enabled = regulator_is_enabled_regmap,
122 	.list_voltage = regulator_list_voltage_linear_range,
123 	.set_voltage_sel = bd718xx_set_voltage_sel_restricted,
124 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
125 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
126 };
127 
128 static const struct regulator_ops bd718xx_buck_regulator_nolinear_ops = {
129 	.enable = regulator_enable_regmap,
130 	.disable = regulator_disable_regmap,
131 	.is_enabled = regulator_is_enabled_regmap,
132 	.list_voltage = regulator_list_voltage_table,
133 	.map_voltage = regulator_map_voltage_ascend,
134 	.set_voltage_sel = bd718xx_set_voltage_sel_restricted,
135 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
136 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
137 };
138 
139 static const struct regulator_ops bd718xx_dvs_buck_regulator_ops = {
140 	.enable = regulator_enable_regmap,
141 	.disable = regulator_disable_regmap,
142 	.is_enabled = regulator_is_enabled_regmap,
143 	.list_voltage = regulator_list_voltage_linear_range,
144 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
145 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
146 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
147 	.set_ramp_delay = bd718xx_buck1234_set_ramp_delay,
148 };
149 
150 /*
151  * BD71837 BUCK1/2/3/4
152  * BD71847 BUCK1/2
153  * 0.70 to 1.30V (10mV step)
154  */
155 static const struct regulator_linear_range bd718xx_dvs_buck_volts[] = {
156 	REGULATOR_LINEAR_RANGE(700000, 0x00, 0x3C, 10000),
157 	REGULATOR_LINEAR_RANGE(1300000, 0x3D, 0x3F, 0),
158 };
159 
160 /*
161  * BD71837 BUCK5
162  * 0.7V to 1.35V  (range 0)
163  * and
164  * 0.675 to 1.325 (range 1)
165  */
166 static const struct regulator_linear_range bd71837_buck5_volts[] = {
167 	/* Ranges when VOLT_SEL bit is 0 */
168 	REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
169 	REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
170 	REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
171 	/* Ranges when VOLT_SEL bit is 1  */
172 	REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
173 	REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
174 	REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
175 };
176 
177 /*
178  * Range selector for first 3 linear ranges is 0x0
179  * and 0x1 for last 3 ranges.
180  */
181 static const unsigned int bd71837_buck5_volt_range_sel[] = {
182 	0x0, 0x0, 0x0, 0x80, 0x80, 0x80
183 };
184 
185 /*
186  * BD71847 BUCK3
187  */
188 static const struct regulator_linear_range bd71847_buck3_volts[] = {
189 	/* Ranges when VOLT_SEL bits are 00 */
190 	REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
191 	REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
192 	REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
193 	/* Ranges when VOLT_SEL bits are 01 */
194 	REGULATOR_LINEAR_RANGE(550000, 0x0, 0x7, 50000),
195 	/* Ranges when VOLT_SEL bits are 11 */
196 	REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
197 	REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
198 	REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
199 };
200 
201 static const unsigned int bd71847_buck3_volt_range_sel[] = {
202 	0x0, 0x0, 0x0, 0x40, 0x80, 0x80, 0x80
203 };
204 
205 static const struct regulator_linear_range bd71847_buck4_volts[] = {
206 	REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
207 	REGULATOR_LINEAR_RANGE(2600000, 0x00, 0x03, 100000),
208 };
209 
210 static const unsigned int bd71847_buck4_volt_range_sel[] = { 0x0, 0x40 };
211 
212 /*
213  * BUCK6
214  * 3.0V to 3.3V (step 100mV)
215  */
216 static const struct regulator_linear_range bd71837_buck6_volts[] = {
217 	REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
218 };
219 
220 /*
221  * BD71837 BUCK7
222  * BD71847 BUCK5
223  * 000 = 1.605V
224  * 001 = 1.695V
225  * 010 = 1.755V
226  * 011 = 1.8V (Initial)
227  * 100 = 1.845V
228  * 101 = 1.905V
229  * 110 = 1.95V
230  * 111 = 1.995V
231  */
232 static const unsigned int bd718xx_3rd_nodvs_buck_volts[] = {
233 	1605000, 1695000, 1755000, 1800000, 1845000, 1905000, 1950000, 1995000
234 };
235 
236 /*
237  * BUCK8
238  * 0.8V to 1.40V (step 10mV)
239  */
240 static const struct regulator_linear_range bd718xx_4th_nodvs_buck_volts[] = {
241 	REGULATOR_LINEAR_RANGE(800000, 0x00, 0x3C, 10000),
242 };
243 
244 /*
245  * LDO1
246  * 3.0 to 3.3V (100mV step)
247  */
248 static const struct regulator_linear_range bd718xx_ldo1_volts[] = {
249 	REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
250 	REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000),
251 };
252 
253 static const unsigned int bd718xx_ldo1_volt_range_sel[] = { 0x0, 0x20 };
254 
255 /*
256  * LDO2
257  * 0.8 or 0.9V
258  */
259 static const unsigned int ldo_2_volts[] = {
260 	900000, 800000
261 };
262 
263 /*
264  * LDO3
265  * 1.8 to 3.3V (100mV step)
266  */
267 static const struct regulator_linear_range bd718xx_ldo3_volts[] = {
268 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
269 };
270 
271 /*
272  * LDO4
273  * 0.9 to 1.8V (100mV step)
274  */
275 static const struct regulator_linear_range bd718xx_ldo4_volts[] = {
276 	REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
277 };
278 
279 /*
280  * LDO5 for BD71837
281  * 1.8 to 3.3V (100mV step)
282  */
283 static const struct regulator_linear_range bd71837_ldo5_volts[] = {
284 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
285 };
286 
287 /*
288  * LDO5 for BD71837
289  * 1.8 to 3.3V (100mV step)
290  */
291 static const struct regulator_linear_range bd71847_ldo5_volts[] = {
292 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
293 	REGULATOR_LINEAR_RANGE(800000, 0x00, 0x0F, 100000),
294 };
295 
296 static const unsigned int bd71847_ldo5_volt_range_sel[] = { 0x0, 0x20 };
297 
298 /*
299  * LDO6
300  * 0.9 to 1.8V (100mV step)
301  */
302 static const struct regulator_linear_range bd718xx_ldo6_volts[] = {
303 	REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
304 };
305 
306 /*
307  * LDO7
308  * 1.8 to 3.3V (100mV step)
309  */
310 static const struct regulator_linear_range bd71837_ldo7_volts[] = {
311 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
312 };
313 
314 struct reg_init {
315 	unsigned int reg;
316 	unsigned int mask;
317 	unsigned int val;
318 };
319 struct bd718xx_regulator_data {
320 	struct regulator_desc desc;
321 	const struct reg_init init;
322 	const struct reg_init *additional_inits;
323 	int additional_init_amnt;
324 };
325 
326 /*
327  * There is a HW quirk in BD71837. The shutdown sequence timings for
328  * bucks/LDOs which are controlled via register interface are changed.
329  * At PMIC poweroff the voltage for BUCK6/7 is cut immediately at the
330  * beginning of shut-down sequence. As bucks 6 and 7 are parent
331  * supplies for LDO5 and LDO6 - this causes LDO5/6 voltage
332  * monitoring to errorneously detect under voltage and force PMIC to
333  * emergency state instead of poweroff. In order to avoid this we
334  * disable voltage monitoring for LDO5 and LDO6
335  */
336 static const struct reg_init bd71837_ldo5_inits[] = {
337 	{
338 		.reg = BD718XX_REG_MVRFLTMASK2,
339 		.mask = BD718XX_LDO5_VRMON80,
340 		.val = BD718XX_LDO5_VRMON80,
341 	},
342 };
343 
344 static const struct reg_init bd71837_ldo6_inits[] = {
345 	{
346 		.reg = BD718XX_REG_MVRFLTMASK2,
347 		.mask = BD718XX_LDO6_VRMON80,
348 		.val = BD718XX_LDO6_VRMON80,
349 	},
350 };
351 
352 #define NUM_DVS_BUCKS 4
353 
354 struct of_dvs_setting {
355 	const char *prop;
356 	unsigned int reg;
357 };
358 
set_dvs_levels(const struct of_dvs_setting * dvs,struct device_node * np,const struct regulator_desc * desc,struct regmap * regmap)359 static int set_dvs_levels(const struct of_dvs_setting *dvs,
360 			  struct device_node *np,
361 			  const struct regulator_desc *desc,
362 			  struct regmap *regmap)
363 {
364 	int ret, i;
365 	unsigned int uv;
366 
367 	ret = of_property_read_u32(np, dvs->prop, &uv);
368 	if (ret) {
369 		if (ret != -EINVAL)
370 			return ret;
371 		return 0;
372 	}
373 
374 	for (i = 0; i < desc->n_voltages; i++) {
375 		ret = regulator_desc_list_voltage_linear_range(desc, i);
376 		if (ret < 0)
377 			continue;
378 		if (ret == uv) {
379 			i <<= ffs(desc->vsel_mask) - 1;
380 			ret = regmap_update_bits(regmap, dvs->reg,
381 						 DVS_BUCK_RUN_MASK, i);
382 			break;
383 		}
384 	}
385 	return ret;
386 }
387 
buck4_set_hw_dvs_levels(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)388 static int buck4_set_hw_dvs_levels(struct device_node *np,
389 			    const struct regulator_desc *desc,
390 			    struct regulator_config *cfg)
391 {
392 	int ret, i;
393 	const struct of_dvs_setting dvs[] = {
394 		{
395 			.prop = "rohm,dvs-run-voltage",
396 			.reg = BD71837_REG_BUCK4_VOLT_RUN,
397 		},
398 	};
399 
400 	for (i = 0; i < ARRAY_SIZE(dvs); i++) {
401 		ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
402 		if (ret)
403 			break;
404 	}
405 	return ret;
406 }
buck3_set_hw_dvs_levels(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)407 static int buck3_set_hw_dvs_levels(struct device_node *np,
408 			    const struct regulator_desc *desc,
409 			    struct regulator_config *cfg)
410 {
411 	int ret, i;
412 	const struct of_dvs_setting dvs[] = {
413 		{
414 			.prop = "rohm,dvs-run-voltage",
415 			.reg = BD71837_REG_BUCK3_VOLT_RUN,
416 		},
417 	};
418 
419 	for (i = 0; i < ARRAY_SIZE(dvs); i++) {
420 		ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
421 		if (ret)
422 			break;
423 	}
424 	return ret;
425 }
426 
buck2_set_hw_dvs_levels(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)427 static int buck2_set_hw_dvs_levels(struct device_node *np,
428 			    const struct regulator_desc *desc,
429 			    struct regulator_config *cfg)
430 {
431 	int ret, i;
432 	const struct of_dvs_setting dvs[] = {
433 		{
434 			.prop = "rohm,dvs-run-voltage",
435 			.reg = BD718XX_REG_BUCK2_VOLT_RUN,
436 		},
437 		{
438 			.prop = "rohm,dvs-idle-voltage",
439 			.reg = BD718XX_REG_BUCK2_VOLT_IDLE,
440 		},
441 	};
442 
443 
444 
445 	for (i = 0; i < ARRAY_SIZE(dvs); i++) {
446 		ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
447 		if (ret)
448 			break;
449 	}
450 	return ret;
451 }
452 
buck1_set_hw_dvs_levels(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)453 static int buck1_set_hw_dvs_levels(struct device_node *np,
454 			    const struct regulator_desc *desc,
455 			    struct regulator_config *cfg)
456 {
457 	int ret, i;
458 	const struct of_dvs_setting dvs[] = {
459 		{
460 			.prop = "rohm,dvs-run-voltage",
461 			.reg = BD718XX_REG_BUCK1_VOLT_RUN,
462 		},
463 		{
464 			.prop = "rohm,dvs-idle-voltage",
465 			.reg = BD718XX_REG_BUCK1_VOLT_IDLE,
466 		},
467 		{
468 			.prop = "rohm,dvs-suspend-voltage",
469 			.reg = BD718XX_REG_BUCK1_VOLT_SUSP,
470 		},
471 	};
472 
473 	for (i = 0; i < ARRAY_SIZE(dvs); i++) {
474 		ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
475 		if (ret)
476 			break;
477 	}
478 	return ret;
479 }
480 
481 static const struct bd718xx_regulator_data bd71847_regulators[] = {
482 	{
483 		.desc = {
484 			.name = "buck1",
485 			.of_match = of_match_ptr("BUCK1"),
486 			.regulators_node = of_match_ptr("regulators"),
487 			.id = BD718XX_BUCK1,
488 			.ops = &bd718xx_dvs_buck_regulator_ops,
489 			.type = REGULATOR_VOLTAGE,
490 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
491 			.linear_ranges = bd718xx_dvs_buck_volts,
492 			.n_linear_ranges =
493 				ARRAY_SIZE(bd718xx_dvs_buck_volts),
494 			.vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
495 			.vsel_mask = DVS_BUCK_RUN_MASK,
496 			.enable_reg = BD718XX_REG_BUCK1_CTRL,
497 			.enable_mask = BD718XX_BUCK_EN,
498 			.owner = THIS_MODULE,
499 			.of_parse_cb = buck1_set_hw_dvs_levels,
500 		},
501 		.init = {
502 			.reg = BD718XX_REG_BUCK1_CTRL,
503 			.mask = BD718XX_BUCK_SEL,
504 			.val = BD718XX_BUCK_SEL,
505 		},
506 	},
507 	{
508 		.desc = {
509 			.name = "buck2",
510 			.of_match = of_match_ptr("BUCK2"),
511 			.regulators_node = of_match_ptr("regulators"),
512 			.id = BD718XX_BUCK2,
513 			.ops = &bd718xx_dvs_buck_regulator_ops,
514 			.type = REGULATOR_VOLTAGE,
515 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
516 			.linear_ranges = bd718xx_dvs_buck_volts,
517 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
518 			.vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
519 			.vsel_mask = DVS_BUCK_RUN_MASK,
520 			.enable_reg = BD718XX_REG_BUCK2_CTRL,
521 			.enable_mask = BD718XX_BUCK_EN,
522 			.owner = THIS_MODULE,
523 			.of_parse_cb = buck2_set_hw_dvs_levels,
524 		},
525 		.init = {
526 			.reg = BD718XX_REG_BUCK2_CTRL,
527 			.mask = BD718XX_BUCK_SEL,
528 			.val = BD718XX_BUCK_SEL,
529 		},
530 	},
531 	{
532 		.desc = {
533 			.name = "buck3",
534 			.of_match = of_match_ptr("BUCK3"),
535 			.regulators_node = of_match_ptr("regulators"),
536 			.id = BD718XX_BUCK3,
537 			.ops = &bd718xx_pickable_range_buck_ops,
538 			.type = REGULATOR_VOLTAGE,
539 			.n_voltages = BD71847_BUCK3_VOLTAGE_NUM,
540 			.linear_ranges = bd71847_buck3_volts,
541 			.n_linear_ranges =
542 				ARRAY_SIZE(bd71847_buck3_volts),
543 			.vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
544 			.vsel_mask = BD718XX_1ST_NODVS_BUCK_MASK,
545 			.vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
546 			.vsel_range_mask = BD71847_BUCK3_RANGE_MASK,
547 			.linear_range_selectors = bd71847_buck3_volt_range_sel,
548 			.enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
549 			.enable_mask = BD718XX_BUCK_EN,
550 			.owner = THIS_MODULE,
551 		},
552 		.init = {
553 			.reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
554 			.mask = BD718XX_BUCK_SEL,
555 			.val = BD718XX_BUCK_SEL,
556 		},
557 	},
558 	{
559 		.desc = {
560 			.name = "buck4",
561 			.of_match = of_match_ptr("BUCK4"),
562 			.regulators_node = of_match_ptr("regulators"),
563 			.id = BD718XX_BUCK4,
564 			.ops = &bd718xx_pickable_range_buck_ops,
565 			.type = REGULATOR_VOLTAGE,
566 			.n_voltages = BD71847_BUCK4_VOLTAGE_NUM,
567 			.linear_ranges = bd71847_buck4_volts,
568 			.n_linear_ranges =
569 				ARRAY_SIZE(bd71847_buck4_volts),
570 			.enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
571 			.vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
572 			.vsel_mask = BD71847_BUCK4_MASK,
573 			.vsel_range_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
574 			.vsel_range_mask = BD71847_BUCK4_RANGE_MASK,
575 			.linear_range_selectors = bd71847_buck4_volt_range_sel,
576 			.enable_mask = BD718XX_BUCK_EN,
577 			.owner = THIS_MODULE,
578 		},
579 		.init = {
580 			.reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
581 			.mask = BD718XX_BUCK_SEL,
582 			.val = BD718XX_BUCK_SEL,
583 		},
584 	},
585 	{
586 		.desc = {
587 			.name = "buck5",
588 			.of_match = of_match_ptr("BUCK5"),
589 			.regulators_node = of_match_ptr("regulators"),
590 			.id = BD718XX_BUCK5,
591 			.ops = &bd718xx_buck_regulator_nolinear_ops,
592 			.type = REGULATOR_VOLTAGE,
593 			.volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
594 			.n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
595 			.vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
596 			.vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
597 			.enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
598 			.enable_mask = BD718XX_BUCK_EN,
599 			.owner = THIS_MODULE,
600 		},
601 		.init = {
602 			.reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
603 			.mask = BD718XX_BUCK_SEL,
604 			.val = BD718XX_BUCK_SEL,
605 		},
606 	},
607 	{
608 		.desc = {
609 			.name = "buck6",
610 			.of_match = of_match_ptr("BUCK6"),
611 			.regulators_node = of_match_ptr("regulators"),
612 			.id = BD718XX_BUCK6,
613 			.ops = &bd718xx_buck_regulator_ops,
614 			.type = REGULATOR_VOLTAGE,
615 			.n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
616 			.linear_ranges = bd718xx_4th_nodvs_buck_volts,
617 			.n_linear_ranges =
618 				ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
619 			.vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
620 			.vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
621 			.enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
622 			.enable_mask = BD718XX_BUCK_EN,
623 			.owner = THIS_MODULE,
624 		},
625 		.init = {
626 			.reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
627 			.mask = BD718XX_BUCK_SEL,
628 			.val = BD718XX_BUCK_SEL,
629 		},
630 	},
631 	{
632 		.desc = {
633 			.name = "ldo1",
634 			.of_match = of_match_ptr("LDO1"),
635 			.regulators_node = of_match_ptr("regulators"),
636 			.id = BD718XX_LDO1,
637 			.ops = &bd718xx_pickable_range_ldo_ops,
638 			.type = REGULATOR_VOLTAGE,
639 			.n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
640 			.linear_ranges = bd718xx_ldo1_volts,
641 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
642 			.vsel_reg = BD718XX_REG_LDO1_VOLT,
643 			.vsel_mask = BD718XX_LDO1_MASK,
644 			.vsel_range_reg = BD718XX_REG_LDO1_VOLT,
645 			.vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
646 			.linear_range_selectors = bd718xx_ldo1_volt_range_sel,
647 			.enable_reg = BD718XX_REG_LDO1_VOLT,
648 			.enable_mask = BD718XX_LDO_EN,
649 			.owner = THIS_MODULE,
650 		},
651 		.init = {
652 			.reg = BD718XX_REG_LDO1_VOLT,
653 			.mask = BD718XX_LDO_SEL,
654 			.val = BD718XX_LDO_SEL,
655 		},
656 	},
657 	{
658 		.desc = {
659 			.name = "ldo2",
660 			.of_match = of_match_ptr("LDO2"),
661 			.regulators_node = of_match_ptr("regulators"),
662 			.id = BD718XX_LDO2,
663 			.ops = &bd718xx_ldo_regulator_nolinear_ops,
664 			.type = REGULATOR_VOLTAGE,
665 			.volt_table = &ldo_2_volts[0],
666 			.vsel_reg = BD718XX_REG_LDO2_VOLT,
667 			.vsel_mask = BD718XX_LDO2_MASK,
668 			.n_voltages = ARRAY_SIZE(ldo_2_volts),
669 			.enable_reg = BD718XX_REG_LDO2_VOLT,
670 			.enable_mask = BD718XX_LDO_EN,
671 			.owner = THIS_MODULE,
672 		},
673 		.init = {
674 			.reg = BD718XX_REG_LDO2_VOLT,
675 			.mask = BD718XX_LDO_SEL,
676 			.val = BD718XX_LDO_SEL,
677 		},
678 	},
679 	{
680 		.desc = {
681 			.name = "ldo3",
682 			.of_match = of_match_ptr("LDO3"),
683 			.regulators_node = of_match_ptr("regulators"),
684 			.id = BD718XX_LDO3,
685 			.ops = &bd718xx_ldo_regulator_ops,
686 			.type = REGULATOR_VOLTAGE,
687 			.n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
688 			.linear_ranges = bd718xx_ldo3_volts,
689 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
690 			.vsel_reg = BD718XX_REG_LDO3_VOLT,
691 			.vsel_mask = BD718XX_LDO3_MASK,
692 			.enable_reg = BD718XX_REG_LDO3_VOLT,
693 			.enable_mask = BD718XX_LDO_EN,
694 			.owner = THIS_MODULE,
695 		},
696 		.init = {
697 			.reg = BD718XX_REG_LDO3_VOLT,
698 			.mask = BD718XX_LDO_SEL,
699 			.val = BD718XX_LDO_SEL,
700 		},
701 	},
702 	{
703 		.desc = {
704 			.name = "ldo4",
705 			.of_match = of_match_ptr("LDO4"),
706 			.regulators_node = of_match_ptr("regulators"),
707 			.id = BD718XX_LDO4,
708 			.ops = &bd718xx_ldo_regulator_ops,
709 			.type = REGULATOR_VOLTAGE,
710 			.n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
711 			.linear_ranges = bd718xx_ldo4_volts,
712 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
713 			.vsel_reg = BD718XX_REG_LDO4_VOLT,
714 			.vsel_mask = BD718XX_LDO4_MASK,
715 			.enable_reg = BD718XX_REG_LDO4_VOLT,
716 			.enable_mask = BD718XX_LDO_EN,
717 			.owner = THIS_MODULE,
718 		},
719 		.init = {
720 			.reg = BD718XX_REG_LDO4_VOLT,
721 			.mask = BD718XX_LDO_SEL,
722 			.val = BD718XX_LDO_SEL,
723 		},
724 	},
725 	{
726 		.desc = {
727 			.name = "ldo5",
728 			.of_match = of_match_ptr("LDO5"),
729 			.regulators_node = of_match_ptr("regulators"),
730 			.id = BD718XX_LDO5,
731 			.ops = &bd718xx_pickable_range_ldo_ops,
732 			.type = REGULATOR_VOLTAGE,
733 			.n_voltages = BD71847_LDO5_VOLTAGE_NUM,
734 			.linear_ranges = bd71847_ldo5_volts,
735 			.n_linear_ranges = ARRAY_SIZE(bd71847_ldo5_volts),
736 			.vsel_reg = BD718XX_REG_LDO5_VOLT,
737 			.vsel_mask = BD71847_LDO5_MASK,
738 			.vsel_range_reg = BD718XX_REG_LDO5_VOLT,
739 			.vsel_range_mask = BD71847_LDO5_RANGE_MASK,
740 			.linear_range_selectors = bd71847_ldo5_volt_range_sel,
741 			.enable_reg = BD718XX_REG_LDO5_VOLT,
742 			.enable_mask = BD718XX_LDO_EN,
743 			.owner = THIS_MODULE,
744 		},
745 		.init = {
746 			.reg = BD718XX_REG_LDO5_VOLT,
747 			.mask = BD718XX_LDO_SEL,
748 			.val = BD718XX_LDO_SEL,
749 		},
750 	},
751 	{
752 		.desc = {
753 			.name = "ldo6",
754 			.of_match = of_match_ptr("LDO6"),
755 			.regulators_node = of_match_ptr("regulators"),
756 			.id = BD718XX_LDO6,
757 			.ops = &bd718xx_ldo_regulator_ops,
758 			.type = REGULATOR_VOLTAGE,
759 			.n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
760 			.linear_ranges = bd718xx_ldo6_volts,
761 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
762 			/* LDO6 is supplied by buck5 */
763 			.supply_name = "buck5",
764 			.vsel_reg = BD718XX_REG_LDO6_VOLT,
765 			.vsel_mask = BD718XX_LDO6_MASK,
766 			.enable_reg = BD718XX_REG_LDO6_VOLT,
767 			.enable_mask = BD718XX_LDO_EN,
768 			.owner = THIS_MODULE,
769 		},
770 		.init = {
771 			.reg = BD718XX_REG_LDO6_VOLT,
772 			.mask = BD718XX_LDO_SEL,
773 			.val = BD718XX_LDO_SEL,
774 		},
775 	},
776 };
777 
778 static const struct bd718xx_regulator_data bd71837_regulators[] = {
779 	{
780 		.desc = {
781 			.name = "buck1",
782 			.of_match = of_match_ptr("BUCK1"),
783 			.regulators_node = of_match_ptr("regulators"),
784 			.id = BD718XX_BUCK1,
785 			.ops = &bd718xx_dvs_buck_regulator_ops,
786 			.type = REGULATOR_VOLTAGE,
787 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
788 			.linear_ranges = bd718xx_dvs_buck_volts,
789 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
790 			.vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
791 			.vsel_mask = DVS_BUCK_RUN_MASK,
792 			.enable_reg = BD718XX_REG_BUCK1_CTRL,
793 			.enable_mask = BD718XX_BUCK_EN,
794 			.owner = THIS_MODULE,
795 			.of_parse_cb = buck1_set_hw_dvs_levels,
796 		},
797 		.init = {
798 			.reg = BD718XX_REG_BUCK1_CTRL,
799 			.mask = BD718XX_BUCK_SEL,
800 			.val = BD718XX_BUCK_SEL,
801 		},
802 	},
803 	{
804 		.desc = {
805 			.name = "buck2",
806 			.of_match = of_match_ptr("BUCK2"),
807 			.regulators_node = of_match_ptr("regulators"),
808 			.id = BD718XX_BUCK2,
809 			.ops = &bd718xx_dvs_buck_regulator_ops,
810 			.type = REGULATOR_VOLTAGE,
811 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
812 			.linear_ranges = bd718xx_dvs_buck_volts,
813 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
814 			.vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
815 			.vsel_mask = DVS_BUCK_RUN_MASK,
816 			.enable_reg = BD718XX_REG_BUCK2_CTRL,
817 			.enable_mask = BD718XX_BUCK_EN,
818 			.owner = THIS_MODULE,
819 			.of_parse_cb = buck2_set_hw_dvs_levels,
820 		},
821 		.init = {
822 			.reg = BD718XX_REG_BUCK2_CTRL,
823 			.mask = BD718XX_BUCK_SEL,
824 			.val = BD718XX_BUCK_SEL,
825 		},
826 	},
827 	{
828 		.desc = {
829 			.name = "buck3",
830 			.of_match = of_match_ptr("BUCK3"),
831 			.regulators_node = of_match_ptr("regulators"),
832 			.id = BD718XX_BUCK3,
833 			.ops = &bd718xx_dvs_buck_regulator_ops,
834 			.type = REGULATOR_VOLTAGE,
835 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
836 			.linear_ranges = bd718xx_dvs_buck_volts,
837 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
838 			.vsel_reg = BD71837_REG_BUCK3_VOLT_RUN,
839 			.vsel_mask = DVS_BUCK_RUN_MASK,
840 			.enable_reg = BD71837_REG_BUCK3_CTRL,
841 			.enable_mask = BD718XX_BUCK_EN,
842 			.owner = THIS_MODULE,
843 			.of_parse_cb = buck3_set_hw_dvs_levels,
844 		},
845 		.init = {
846 			.reg = BD71837_REG_BUCK3_CTRL,
847 			.mask = BD718XX_BUCK_SEL,
848 			.val = BD718XX_BUCK_SEL,
849 		},
850 	},
851 	{
852 		.desc = {
853 			.name = "buck4",
854 			.of_match = of_match_ptr("BUCK4"),
855 			.regulators_node = of_match_ptr("regulators"),
856 			.id = BD718XX_BUCK4,
857 			.ops = &bd718xx_dvs_buck_regulator_ops,
858 			.type = REGULATOR_VOLTAGE,
859 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
860 			.linear_ranges = bd718xx_dvs_buck_volts,
861 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
862 			.vsel_reg = BD71837_REG_BUCK4_VOLT_RUN,
863 			.vsel_mask = DVS_BUCK_RUN_MASK,
864 			.enable_reg = BD71837_REG_BUCK4_CTRL,
865 			.enable_mask = BD718XX_BUCK_EN,
866 			.owner = THIS_MODULE,
867 			.of_parse_cb = buck4_set_hw_dvs_levels,
868 		},
869 		.init = {
870 			.reg = BD71837_REG_BUCK4_CTRL,
871 			.mask = BD718XX_BUCK_SEL,
872 			.val = BD718XX_BUCK_SEL,
873 		},
874 	},
875 	{
876 		.desc = {
877 			.name = "buck5",
878 			.of_match = of_match_ptr("BUCK5"),
879 			.regulators_node = of_match_ptr("regulators"),
880 			.id = BD718XX_BUCK5,
881 			.ops = &bd718xx_pickable_range_buck_ops,
882 			.type = REGULATOR_VOLTAGE,
883 			.n_voltages = BD71837_BUCK5_VOLTAGE_NUM,
884 			.linear_ranges = bd71837_buck5_volts,
885 			.n_linear_ranges =
886 				ARRAY_SIZE(bd71837_buck5_volts),
887 			.vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
888 			.vsel_mask = BD71837_BUCK5_MASK,
889 			.vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
890 			.vsel_range_mask = BD71837_BUCK5_RANGE_MASK,
891 			.linear_range_selectors = bd71837_buck5_volt_range_sel,
892 			.enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
893 			.enable_mask = BD718XX_BUCK_EN,
894 			.owner = THIS_MODULE,
895 		},
896 		.init = {
897 			.reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
898 			.mask = BD718XX_BUCK_SEL,
899 			.val = BD718XX_BUCK_SEL,
900 		},
901 	},
902 	{
903 		.desc = {
904 			.name = "buck6",
905 			.of_match = of_match_ptr("BUCK6"),
906 			.regulators_node = of_match_ptr("regulators"),
907 			.id = BD718XX_BUCK6,
908 			.ops = &bd718xx_buck_regulator_ops,
909 			.type = REGULATOR_VOLTAGE,
910 			.n_voltages = BD71837_BUCK6_VOLTAGE_NUM,
911 			.linear_ranges = bd71837_buck6_volts,
912 			.n_linear_ranges =
913 				ARRAY_SIZE(bd71837_buck6_volts),
914 			.vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
915 			.vsel_mask = BD71837_BUCK6_MASK,
916 			.enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
917 			.enable_mask = BD718XX_BUCK_EN,
918 			.owner = THIS_MODULE,
919 		},
920 		.init = {
921 			.reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
922 			.mask = BD718XX_BUCK_SEL,
923 			.val = BD718XX_BUCK_SEL,
924 		},
925 	},
926 	{
927 		.desc = {
928 			.name = "buck7",
929 			.of_match = of_match_ptr("BUCK7"),
930 			.regulators_node = of_match_ptr("regulators"),
931 			.id = BD718XX_BUCK7,
932 			.ops = &bd718xx_buck_regulator_nolinear_ops,
933 			.type = REGULATOR_VOLTAGE,
934 			.volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
935 			.n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
936 			.vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
937 			.vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
938 			.enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
939 			.enable_mask = BD718XX_BUCK_EN,
940 			.owner = THIS_MODULE,
941 		},
942 		.init = {
943 			.reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
944 			.mask = BD718XX_BUCK_SEL,
945 			.val = BD718XX_BUCK_SEL,
946 		},
947 	},
948 	{
949 		.desc = {
950 			.name = "buck8",
951 			.of_match = of_match_ptr("BUCK8"),
952 			.regulators_node = of_match_ptr("regulators"),
953 			.id = BD718XX_BUCK8,
954 			.ops = &bd718xx_buck_regulator_ops,
955 			.type = REGULATOR_VOLTAGE,
956 			.n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
957 			.linear_ranges = bd718xx_4th_nodvs_buck_volts,
958 			.n_linear_ranges =
959 				ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
960 			.vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
961 			.vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
962 			.enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
963 			.enable_mask = BD718XX_BUCK_EN,
964 			.owner = THIS_MODULE,
965 		},
966 		.init = {
967 			.reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
968 			.mask = BD718XX_BUCK_SEL,
969 			.val = BD718XX_BUCK_SEL,
970 		},
971 	},
972 	{
973 		.desc = {
974 			.name = "ldo1",
975 			.of_match = of_match_ptr("LDO1"),
976 			.regulators_node = of_match_ptr("regulators"),
977 			.id = BD718XX_LDO1,
978 			.ops = &bd718xx_pickable_range_ldo_ops,
979 			.type = REGULATOR_VOLTAGE,
980 			.n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
981 			.linear_ranges = bd718xx_ldo1_volts,
982 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
983 			.vsel_reg = BD718XX_REG_LDO1_VOLT,
984 			.vsel_mask = BD718XX_LDO1_MASK,
985 			.vsel_range_reg = BD718XX_REG_LDO1_VOLT,
986 			.vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
987 			.linear_range_selectors = bd718xx_ldo1_volt_range_sel,
988 			.enable_reg = BD718XX_REG_LDO1_VOLT,
989 			.enable_mask = BD718XX_LDO_EN,
990 			.owner = THIS_MODULE,
991 		},
992 		.init = {
993 			.reg = BD718XX_REG_LDO1_VOLT,
994 			.mask = BD718XX_LDO_SEL,
995 			.val = BD718XX_LDO_SEL,
996 		},
997 	},
998 	{
999 		.desc = {
1000 			.name = "ldo2",
1001 			.of_match = of_match_ptr("LDO2"),
1002 			.regulators_node = of_match_ptr("regulators"),
1003 			.id = BD718XX_LDO2,
1004 			.ops = &bd718xx_ldo_regulator_nolinear_ops,
1005 			.type = REGULATOR_VOLTAGE,
1006 			.volt_table = &ldo_2_volts[0],
1007 			.vsel_reg = BD718XX_REG_LDO2_VOLT,
1008 			.vsel_mask = BD718XX_LDO2_MASK,
1009 			.n_voltages = ARRAY_SIZE(ldo_2_volts),
1010 			.enable_reg = BD718XX_REG_LDO2_VOLT,
1011 			.enable_mask = BD718XX_LDO_EN,
1012 			.owner = THIS_MODULE,
1013 		},
1014 		.init = {
1015 			.reg = BD718XX_REG_LDO2_VOLT,
1016 			.mask = BD718XX_LDO_SEL,
1017 			.val = BD718XX_LDO_SEL,
1018 		},
1019 	},
1020 	{
1021 		.desc = {
1022 			.name = "ldo3",
1023 			.of_match = of_match_ptr("LDO3"),
1024 			.regulators_node = of_match_ptr("regulators"),
1025 			.id = BD718XX_LDO3,
1026 			.ops = &bd718xx_ldo_regulator_ops,
1027 			.type = REGULATOR_VOLTAGE,
1028 			.n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
1029 			.linear_ranges = bd718xx_ldo3_volts,
1030 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
1031 			.vsel_reg = BD718XX_REG_LDO3_VOLT,
1032 			.vsel_mask = BD718XX_LDO3_MASK,
1033 			.enable_reg = BD718XX_REG_LDO3_VOLT,
1034 			.enable_mask = BD718XX_LDO_EN,
1035 			.owner = THIS_MODULE,
1036 		},
1037 		.init = {
1038 			.reg = BD718XX_REG_LDO3_VOLT,
1039 			.mask = BD718XX_LDO_SEL,
1040 			.val = BD718XX_LDO_SEL,
1041 		},
1042 	},
1043 	{
1044 		.desc = {
1045 			.name = "ldo4",
1046 			.of_match = of_match_ptr("LDO4"),
1047 			.regulators_node = of_match_ptr("regulators"),
1048 			.id = BD718XX_LDO4,
1049 			.ops = &bd718xx_ldo_regulator_ops,
1050 			.type = REGULATOR_VOLTAGE,
1051 			.n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
1052 			.linear_ranges = bd718xx_ldo4_volts,
1053 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
1054 			.vsel_reg = BD718XX_REG_LDO4_VOLT,
1055 			.vsel_mask = BD718XX_LDO4_MASK,
1056 			.enable_reg = BD718XX_REG_LDO4_VOLT,
1057 			.enable_mask = BD718XX_LDO_EN,
1058 			.owner = THIS_MODULE,
1059 		},
1060 		.init = {
1061 			.reg = BD718XX_REG_LDO4_VOLT,
1062 			.mask = BD718XX_LDO_SEL,
1063 			.val = BD718XX_LDO_SEL,
1064 		},
1065 	},
1066 	{
1067 		.desc = {
1068 			.name = "ldo5",
1069 			.of_match = of_match_ptr("LDO5"),
1070 			.regulators_node = of_match_ptr("regulators"),
1071 			.id = BD718XX_LDO5,
1072 			.ops = &bd718xx_ldo_regulator_ops,
1073 			.type = REGULATOR_VOLTAGE,
1074 			.n_voltages = BD71837_LDO5_VOLTAGE_NUM,
1075 			.linear_ranges = bd71837_ldo5_volts,
1076 			.n_linear_ranges = ARRAY_SIZE(bd71837_ldo5_volts),
1077 			/* LDO5 is supplied by buck6 */
1078 			.supply_name = "buck6",
1079 			.vsel_reg = BD718XX_REG_LDO5_VOLT,
1080 			.vsel_mask = BD71837_LDO5_MASK,
1081 			.enable_reg = BD718XX_REG_LDO5_VOLT,
1082 			.enable_mask = BD718XX_LDO_EN,
1083 			.owner = THIS_MODULE,
1084 		},
1085 		.init = {
1086 			.reg = BD718XX_REG_LDO5_VOLT,
1087 			.mask = BD718XX_LDO_SEL,
1088 			.val = BD718XX_LDO_SEL,
1089 		},
1090 		.additional_inits = bd71837_ldo5_inits,
1091 		.additional_init_amnt = ARRAY_SIZE(bd71837_ldo5_inits),
1092 	},
1093 	{
1094 		.desc = {
1095 			.name = "ldo6",
1096 			.of_match = of_match_ptr("LDO6"),
1097 			.regulators_node = of_match_ptr("regulators"),
1098 			.id = BD718XX_LDO6,
1099 			.ops = &bd718xx_ldo_regulator_ops,
1100 			.type = REGULATOR_VOLTAGE,
1101 			.n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
1102 			.linear_ranges = bd718xx_ldo6_volts,
1103 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
1104 			/* LDO6 is supplied by buck7 */
1105 			.supply_name = "buck7",
1106 			.vsel_reg = BD718XX_REG_LDO6_VOLT,
1107 			.vsel_mask = BD718XX_LDO6_MASK,
1108 			.enable_reg = BD718XX_REG_LDO6_VOLT,
1109 			.enable_mask = BD718XX_LDO_EN,
1110 			.owner = THIS_MODULE,
1111 		},
1112 		.init = {
1113 			.reg = BD718XX_REG_LDO6_VOLT,
1114 			.mask = BD718XX_LDO_SEL,
1115 			.val = BD718XX_LDO_SEL,
1116 		},
1117 		.additional_inits = bd71837_ldo6_inits,
1118 		.additional_init_amnt = ARRAY_SIZE(bd71837_ldo6_inits),
1119 	},
1120 	{
1121 		.desc = {
1122 			.name = "ldo7",
1123 			.of_match = of_match_ptr("LDO7"),
1124 			.regulators_node = of_match_ptr("regulators"),
1125 			.id = BD718XX_LDO7,
1126 			.ops = &bd718xx_ldo_regulator_ops,
1127 			.type = REGULATOR_VOLTAGE,
1128 			.n_voltages = BD71837_LDO7_VOLTAGE_NUM,
1129 			.linear_ranges = bd71837_ldo7_volts,
1130 			.n_linear_ranges = ARRAY_SIZE(bd71837_ldo7_volts),
1131 			.vsel_reg = BD71837_REG_LDO7_VOLT,
1132 			.vsel_mask = BD71837_LDO7_MASK,
1133 			.enable_reg = BD71837_REG_LDO7_VOLT,
1134 			.enable_mask = BD718XX_LDO_EN,
1135 			.owner = THIS_MODULE,
1136 		},
1137 		.init = {
1138 			.reg = BD71837_REG_LDO7_VOLT,
1139 			.mask = BD718XX_LDO_SEL,
1140 			.val = BD718XX_LDO_SEL,
1141 		},
1142 	},
1143 };
1144 
1145 struct bd718xx_pmic_inits {
1146 	const struct bd718xx_regulator_data *r_datas;
1147 	unsigned int r_amount;
1148 };
1149 
bd718xx_probe(struct platform_device * pdev)1150 static int bd718xx_probe(struct platform_device *pdev)
1151 {
1152 	struct bd718xx *mfd;
1153 	struct regulator_config config = { 0 };
1154 	struct bd718xx_pmic_inits pmic_regulators[ROHM_CHIP_TYPE_AMOUNT] = {
1155 		[ROHM_CHIP_TYPE_BD71837] = {
1156 			.r_datas = bd71837_regulators,
1157 			.r_amount = ARRAY_SIZE(bd71837_regulators),
1158 		},
1159 		[ROHM_CHIP_TYPE_BD71847] = {
1160 			.r_datas = bd71847_regulators,
1161 			.r_amount = ARRAY_SIZE(bd71847_regulators),
1162 		},
1163 	};
1164 
1165 	int i, j, err;
1166 	bool use_snvs;
1167 
1168 	mfd = dev_get_drvdata(pdev->dev.parent);
1169 	if (!mfd) {
1170 		dev_err(&pdev->dev, "No MFD driver data\n");
1171 		err = -EINVAL;
1172 		goto err;
1173 	}
1174 
1175 	if (mfd->chip.chip_type >= ROHM_CHIP_TYPE_AMOUNT ||
1176 	    !pmic_regulators[mfd->chip.chip_type].r_datas) {
1177 		dev_err(&pdev->dev, "Unsupported chip type\n");
1178 		err = -EINVAL;
1179 		goto err;
1180 	}
1181 
1182 	/* Register LOCK release */
1183 	err = regmap_update_bits(mfd->chip.regmap, BD718XX_REG_REGLOCK,
1184 				 (REGLOCK_PWRSEQ | REGLOCK_VREG), 0);
1185 	if (err) {
1186 		dev_err(&pdev->dev, "Failed to unlock PMIC (%d)\n", err);
1187 		goto err;
1188 	} else {
1189 		dev_dbg(&pdev->dev, "Unlocked lock register 0x%x\n",
1190 			BD718XX_REG_REGLOCK);
1191 	}
1192 
1193 	use_snvs = of_property_read_bool(pdev->dev.parent->of_node,
1194 					 "rohm,reset-snvs-powered");
1195 
1196 	/*
1197 	 * Change the next stage from poweroff to be READY instead of SNVS
1198 	 * for all reset types because OTP loading at READY will clear SEL
1199 	 * bit allowing HW defaults for power rails to be used
1200 	 */
1201 	if (!use_snvs) {
1202 		err = regmap_update_bits(mfd->chip.regmap,
1203 					 BD718XX_REG_TRANS_COND1,
1204 					 BD718XX_ON_REQ_POWEROFF_MASK |
1205 					 BD718XX_SWRESET_POWEROFF_MASK |
1206 					 BD718XX_WDOG_POWEROFF_MASK |
1207 					 BD718XX_KEY_L_POWEROFF_MASK,
1208 					 BD718XX_POWOFF_TO_RDY);
1209 		if (err) {
1210 			dev_err(&pdev->dev, "Failed to change reset target\n");
1211 			goto err;
1212 		} else {
1213 			dev_dbg(&pdev->dev,
1214 				"Changed all resets from SVNS to READY\n");
1215 		}
1216 	}
1217 
1218 	for (i = 0; i < pmic_regulators[mfd->chip.chip_type].r_amount; i++) {
1219 
1220 		const struct regulator_desc *desc;
1221 		struct regulator_dev *rdev;
1222 		const struct bd718xx_regulator_data *r;
1223 
1224 		r = &pmic_regulators[mfd->chip.chip_type].r_datas[i];
1225 		desc = &r->desc;
1226 
1227 		config.dev = pdev->dev.parent;
1228 		config.regmap = mfd->chip.regmap;
1229 
1230 		rdev = devm_regulator_register(&pdev->dev, desc, &config);
1231 		if (IS_ERR(rdev)) {
1232 			dev_err(&pdev->dev,
1233 				"failed to register %s regulator\n",
1234 				desc->name);
1235 			err = PTR_ERR(rdev);
1236 			goto err;
1237 		}
1238 
1239 		/*
1240 		 * Regulator register gets the regulator constraints and
1241 		 * applies them (set_machine_constraints). This should have
1242 		 * turned the control register(s) to correct values and we
1243 		 * can now switch the control from PMIC state machine to the
1244 		 * register interface
1245 		 *
1246 		 * At poweroff transition PMIC HW disables EN bit for
1247 		 * regulators but leaves SEL bit untouched. So if state
1248 		 * transition from POWEROFF is done to SNVS - then all power
1249 		 * rails controlled by SW (having SEL bit set) stay disabled
1250 		 * as EN is cleared. This will result boot failure if any
1251 		 * crucial systems are powered by these rails. We don't
1252 		 * enable SW control for crucial regulators if snvs state is
1253 		 * used
1254 		 */
1255 		if (!use_snvs || !rdev->constraints->always_on ||
1256 		    !rdev->constraints->boot_on) {
1257 			err = regmap_update_bits(mfd->chip.regmap, r->init.reg,
1258 						 r->init.mask, r->init.val);
1259 			if (err) {
1260 				dev_err(&pdev->dev,
1261 					"Failed to take control for (%s)\n",
1262 					desc->name);
1263 				goto err;
1264 			}
1265 		}
1266 		for (j = 0; j < r->additional_init_amnt; j++) {
1267 			err = regmap_update_bits(mfd->chip.regmap,
1268 						 r->additional_inits[j].reg,
1269 						 r->additional_inits[j].mask,
1270 						 r->additional_inits[j].val);
1271 			if (err) {
1272 				dev_err(&pdev->dev,
1273 					"Buck (%s) initialization failed\n",
1274 					desc->name);
1275 				goto err;
1276 			}
1277 		}
1278 	}
1279 
1280 err:
1281 	return err;
1282 }
1283 
1284 static struct platform_driver bd718xx_regulator = {
1285 	.driver = {
1286 		.name = "bd718xx-pmic",
1287 	},
1288 	.probe = bd718xx_probe,
1289 };
1290 
1291 module_platform_driver(bd718xx_regulator);
1292 
1293 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1294 MODULE_DESCRIPTION("BD71837/BD71847 voltage regulator driver");
1295 MODULE_LICENSE("GPL");
1296