xref: /linux/drivers/regulator/bd718x7-regulator.c (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
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/cleanup.h>
6 #include <linux/delay.h>
7 #include <linux/err.h>
8 #include <linux/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/mfd/rohm-bd718x7.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/platform_device.h>
14 #include <linux/regulator/driver.h>
15 #include <linux/regulator/machine.h>
16 #include <linux/regulator/of_regulator.h>
17 #include <linux/slab.h>
18 
19 /* Typical regulator startup times as per data sheet in uS */
20 #define BD71847_BUCK1_STARTUP_TIME 144
21 #define BD71847_BUCK2_STARTUP_TIME 162
22 #define BD71847_BUCK3_STARTUP_TIME 162
23 #define BD71847_BUCK4_STARTUP_TIME 240
24 #define BD71847_BUCK5_STARTUP_TIME 270
25 #define BD71847_BUCK6_STARTUP_TIME 200
26 #define BD71847_LDO1_STARTUP_TIME  440
27 #define BD71847_LDO2_STARTUP_TIME  370
28 #define BD71847_LDO3_STARTUP_TIME  310
29 #define BD71847_LDO4_STARTUP_TIME  400
30 #define BD71847_LDO5_STARTUP_TIME  530
31 #define BD71847_LDO6_STARTUP_TIME  400
32 
33 #define BD71837_BUCK1_STARTUP_TIME 160
34 #define BD71837_BUCK2_STARTUP_TIME 180
35 #define BD71837_BUCK3_STARTUP_TIME 180
36 #define BD71837_BUCK4_STARTUP_TIME 180
37 #define BD71837_BUCK5_STARTUP_TIME 160
38 #define BD71837_BUCK6_STARTUP_TIME 240
39 #define BD71837_BUCK7_STARTUP_TIME 220
40 #define BD71837_BUCK8_STARTUP_TIME 200
41 #define BD71837_LDO1_STARTUP_TIME  440
42 #define BD71837_LDO2_STARTUP_TIME  370
43 #define BD71837_LDO3_STARTUP_TIME  310
44 #define BD71837_LDO4_STARTUP_TIME  400
45 #define BD71837_LDO5_STARTUP_TIME  310
46 #define BD71837_LDO6_STARTUP_TIME  400
47 #define BD71837_LDO7_STARTUP_TIME  530
48 
49 /*
50  * BD718(37/47/50) have two "enable control modes". ON/OFF can either be
51  * controlled by software - or by PMIC internal HW state machine. Whether
52  * regulator should be under SW or HW control can be defined from device-tree.
53  * Let's provide separate ops for regulators to use depending on the "enable
54  * control mode".
55  */
56 #define BD718XX_HWOPNAME(swopname) swopname##_hwcontrol
57 
58 #define BD718XX_OPS(name, _list_voltage, _map_voltage, _set_voltage_sel, \
59 		   _get_voltage_sel, _set_voltage_time_sel, _set_ramp_delay, \
60 		   _set_uvp, _set_ovp)				\
61 static const struct regulator_ops name = {			\
62 	.enable = regulator_enable_regmap,			\
63 	.disable = regulator_disable_regmap,			\
64 	.is_enabled = regulator_is_enabled_regmap,		\
65 	.list_voltage = (_list_voltage),			\
66 	.map_voltage = (_map_voltage),				\
67 	.set_voltage_sel = (_set_voltage_sel),			\
68 	.get_voltage_sel = (_get_voltage_sel),			\
69 	.set_voltage_time_sel = (_set_voltage_time_sel),	\
70 	.set_ramp_delay = (_set_ramp_delay),			\
71 	.set_under_voltage_protection = (_set_uvp),		\
72 	.set_over_voltage_protection = (_set_ovp),		\
73 };								\
74 								\
75 static const struct regulator_ops BD718XX_HWOPNAME(name) = {	\
76 	.is_enabled = always_enabled_by_hwstate,		\
77 	.list_voltage = (_list_voltage),			\
78 	.map_voltage = (_map_voltage),				\
79 	.set_voltage_sel = (_set_voltage_sel),			\
80 	.get_voltage_sel = (_get_voltage_sel),			\
81 	.set_voltage_time_sel = (_set_voltage_time_sel),	\
82 	.set_ramp_delay = (_set_ramp_delay),			\
83 	.set_under_voltage_protection = (_set_uvp),		\
84 	.set_over_voltage_protection = (_set_ovp),		\
85 }								\
86 
87 /*
88  * BUCK1/2/3/4
89  * BUCK1RAMPRATE[1:0] BUCK1 DVS ramp rate setting
90  * 00: 10.00mV/usec 10mV 1uS
91  * 01: 5.00mV/usec	10mV 2uS
92  * 10: 2.50mV/usec	10mV 4uS
93  * 11: 1.25mV/usec	10mV 8uS
94  */
95 static const unsigned int bd718xx_ramp_delay[] = { 10000, 5000, 2500, 1250 };
96 
97 /* These functions are used when regulators are under HW state machine control.
98  * We assume PMIC is in RUN state because SW running and able to query the
99  * status. Most of the regulators have fixed ON or OFF state at RUN/IDLE so for
100  * them we just return a constant. BD71837 BUCK3 and BUCK4 are exceptions as
101  * they support configuring the ON/OFF state for RUN.
102  *
103  * Note for next hacker - these PMICs have a register where the HW state can be
104  * read. If assuming RUN appears to be false in your use-case - you can
105  * implement state reading (although that is not going to be atomic) before
106  * returning the enable state.
107  */
always_enabled_by_hwstate(struct regulator_dev * rdev)108 static int always_enabled_by_hwstate(struct regulator_dev *rdev)
109 {
110 	return 1;
111 }
112 
never_enabled_by_hwstate(struct regulator_dev * rdev)113 static int never_enabled_by_hwstate(struct regulator_dev *rdev)
114 {
115 	return 0;
116 }
117 
bd71837_get_buck34_enable_hwctrl(struct regulator_dev * rdev)118 static int bd71837_get_buck34_enable_hwctrl(struct regulator_dev *rdev)
119 {
120 	int ret;
121 	unsigned int val;
122 
123 	ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
124 	if (ret)
125 		return ret;
126 
127 	return !!(BD718XX_BUCK_RUN_ON & val);
128 }
129 
voltage_change_done(struct regulator_dev * rdev,unsigned int sel,unsigned int * mask)130 static void voltage_change_done(struct regulator_dev *rdev, unsigned int sel,
131 				unsigned int *mask)
132 {
133 	int ret;
134 
135 	if (*mask) {
136 		/*
137 		 * Let's allow scheduling as we use I2C anyways. We just need to
138 		 * guarantee minimum of 1ms sleep - it shouldn't matter if we
139 		 * exceed it due to the scheduling.
140 		 */
141 		msleep(1);
142 
143 		ret = regmap_clear_bits(rdev->regmap, BD718XX_REG_MVRFLTMASK2,
144 					 *mask);
145 		if (ret)
146 			dev_err(&rdev->dev,
147 				"Failed to re-enable voltage monitoring (%d)\n",
148 				ret);
149 	}
150 }
151 
voltage_change_prepare(struct regulator_dev * rdev,unsigned int sel,unsigned int * mask)152 static int voltage_change_prepare(struct regulator_dev *rdev, unsigned int sel,
153 				  unsigned int *mask)
154 {
155 	int ret;
156 
157 	*mask = 0;
158 	if (rdev->desc->ops->is_enabled(rdev)) {
159 		int now, new;
160 
161 		now = rdev->desc->ops->get_voltage_sel(rdev);
162 		if (now < 0)
163 			return now;
164 
165 		now = rdev->desc->ops->list_voltage(rdev, now);
166 		if (now < 0)
167 			return now;
168 
169 		new = rdev->desc->ops->list_voltage(rdev, sel);
170 		if (new < 0)
171 			return new;
172 
173 		/*
174 		 * If we increase LDO voltage when LDO is enabled we need to
175 		 * disable the power-good detection until voltage has reached
176 		 * the new level. According to HW colleagues the maximum time
177 		 * it takes is 1000us. I assume that on systems with light load
178 		 * this might be less - and we could probably use DT to give
179 		 * system specific delay value if performance matters.
180 		 *
181 		 * Well, knowing we use I2C here and can add scheduling delays
182 		 * I don't think it is worth the hassle and I just add fixed
183 		 * 1ms sleep here (and allow scheduling). If this turns out to
184 		 * be a problem we can change it to delay and make the delay
185 		 * time configurable.
186 		 */
187 		if (new > now) {
188 			int tmp;
189 			int prot_bit;
190 			int ldo_offset = rdev->desc->id - BD718XX_LDO1;
191 
192 			prot_bit = BD718XX_LDO1_VRMON80 << ldo_offset;
193 			ret = regmap_read(rdev->regmap, BD718XX_REG_MVRFLTMASK2,
194 					  &tmp);
195 			if (ret) {
196 				dev_err(&rdev->dev,
197 					"Failed to read voltage monitoring state\n");
198 				return ret;
199 			}
200 
201 			if (!(tmp & prot_bit)) {
202 				/* We disable protection if it was enabled... */
203 				ret = regmap_set_bits(rdev->regmap,
204 						      BD718XX_REG_MVRFLTMASK2,
205 						      prot_bit);
206 				/* ...and we also want to re-enable it */
207 				*mask = prot_bit;
208 			}
209 			if (ret) {
210 				dev_err(&rdev->dev,
211 					"Failed to stop voltage monitoring\n");
212 				return ret;
213 			}
214 		}
215 	}
216 
217 	return 0;
218 }
219 
bd718xx_set_voltage_sel_restricted(struct regulator_dev * rdev,unsigned int sel)220 static int bd718xx_set_voltage_sel_restricted(struct regulator_dev *rdev,
221 						    unsigned int sel)
222 {
223 	int ret;
224 	int mask;
225 
226 	ret = voltage_change_prepare(rdev, sel, &mask);
227 	if (ret)
228 		return ret;
229 
230 	ret = regulator_set_voltage_sel_regmap(rdev, sel);
231 	voltage_change_done(rdev, sel, &mask);
232 
233 	return ret;
234 }
235 
bd718xx_set_voltage_sel_pickable_restricted(struct regulator_dev * rdev,unsigned int sel)236 static int bd718xx_set_voltage_sel_pickable_restricted(
237 		struct regulator_dev *rdev, unsigned int sel)
238 {
239 	int ret;
240 	int mask;
241 
242 	ret = voltage_change_prepare(rdev, sel, &mask);
243 	if (ret)
244 		return ret;
245 
246 	ret = regulator_set_voltage_sel_pickable_regmap(rdev, sel);
247 	voltage_change_done(rdev, sel, &mask);
248 
249 	return ret;
250 }
251 
bd71837_set_voltage_sel_pickable_restricted(struct regulator_dev * rdev,unsigned int sel)252 static int bd71837_set_voltage_sel_pickable_restricted(
253 		struct regulator_dev *rdev, unsigned int sel)
254 {
255 	if (rdev->desc->ops->is_enabled(rdev))
256 		return -EBUSY;
257 
258 	return regulator_set_voltage_sel_pickable_regmap(rdev, sel);
259 }
260 
261 /*
262  * BD71837 BUCK1/2/3/4
263  * BD71847 BUCK1/2
264  * 0.70 to 1.30V (10mV step)
265  */
266 static const struct linear_range bd718xx_dvs_buck_volts[] = {
267 	REGULATOR_LINEAR_RANGE(700000, 0x00, 0x3C, 10000),
268 	REGULATOR_LINEAR_RANGE(1300000, 0x3D, 0x3F, 0),
269 };
270 
271 /*
272  * BD71837 BUCK5
273  * 0.7V to 1.35V  (range 0)
274  * and
275  * 0.675 to 1.325 (range 1)
276  */
277 static const struct linear_range bd71837_buck5_volts[] = {
278 	/* Ranges when VOLT_SEL bit is 0 */
279 	REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
280 	REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
281 	REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
282 	/* Ranges when VOLT_SEL bit is 1  */
283 	REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
284 	REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
285 	REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
286 };
287 
288 /*
289  * Range selector for first 3 linear ranges is 0x0
290  * and 0x1 for last 3 ranges.
291  */
292 static const unsigned int bd71837_buck5_volt_range_sel[] = {
293 	0x0, 0x0, 0x0, 0x1, 0x1, 0x1
294 };
295 
296 /*
297  * BD71847 BUCK3
298  */
299 static const struct linear_range bd71847_buck3_volts[] = {
300 	/* Ranges when VOLT_SEL bits are 00 */
301 	REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
302 	REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
303 	REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
304 	/* Ranges when VOLT_SEL bits are 01 */
305 	REGULATOR_LINEAR_RANGE(550000, 0x0, 0x7, 50000),
306 	/* Ranges when VOLT_SEL bits are 11 */
307 	REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
308 	REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
309 	REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
310 };
311 
312 static const unsigned int bd71847_buck3_volt_range_sel[] = {
313 	0x0, 0x0, 0x0, 0x1, 0x2, 0x2, 0x2
314 };
315 
316 static const struct linear_range bd71847_buck4_volts[] = {
317 	REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
318 	REGULATOR_LINEAR_RANGE(2600000, 0x00, 0x03, 100000),
319 };
320 
321 static const unsigned int bd71847_buck4_volt_range_sel[] = { 0x0, 0x1 };
322 
323 /*
324  * BUCK6
325  * 3.0V to 3.3V (step 100mV)
326  */
327 static const struct linear_range bd71837_buck6_volts[] = {
328 	REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
329 };
330 
331 /*
332  * BD71837 BUCK7
333  * BD71847 BUCK5
334  * 000 = 1.605V
335  * 001 = 1.695V
336  * 010 = 1.755V
337  * 011 = 1.8V (Initial)
338  * 100 = 1.845V
339  * 101 = 1.905V
340  * 110 = 1.95V
341  * 111 = 1.995V
342  */
343 static const unsigned int bd718xx_3rd_nodvs_buck_volts[] = {
344 	1605000, 1695000, 1755000, 1800000, 1845000, 1905000, 1950000, 1995000
345 };
346 
347 /*
348  * BUCK8
349  * 0.8V to 1.40V (step 10mV)
350  */
351 static const struct linear_range bd718xx_4th_nodvs_buck_volts[] = {
352 	REGULATOR_LINEAR_RANGE(800000, 0x00, 0x3C, 10000),
353 };
354 
355 /*
356  * LDO1
357  * 3.0 to 3.3V (100mV step)
358  */
359 static const struct linear_range bd718xx_ldo1_volts[] = {
360 	REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
361 	REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000),
362 };
363 
364 static const unsigned int bd718xx_ldo1_volt_range_sel[] = { 0x0, 0x1 };
365 
366 /*
367  * LDO2
368  * 0.8 or 0.9V
369  */
370 static const unsigned int ldo_2_volts[] = {
371 	900000, 800000
372 };
373 
374 /*
375  * LDO3
376  * 1.8 to 3.3V (100mV step)
377  */
378 static const struct linear_range bd718xx_ldo3_volts[] = {
379 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
380 };
381 
382 /*
383  * LDO4
384  * 0.9 to 1.8V (100mV step)
385  */
386 static const struct linear_range bd718xx_ldo4_volts[] = {
387 	REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
388 };
389 
390 /*
391  * LDO5 for BD71837
392  * 1.8 to 3.3V (100mV step)
393  */
394 static const struct linear_range bd71837_ldo5_volts[] = {
395 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
396 };
397 
398 /*
399  * LDO5 for BD71837
400  * 1.8 to 3.3V (100mV step)
401  */
402 static const struct linear_range bd71847_ldo5_volts[] = {
403 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
404 	REGULATOR_LINEAR_RANGE(800000, 0x00, 0x0F, 100000),
405 };
406 
407 static const unsigned int bd71847_ldo5_volt_range_sel[] = { 0x0, 0x1 };
408 
409 /*
410  * LDO6
411  * 0.9 to 1.8V (100mV step)
412  */
413 static const struct linear_range bd718xx_ldo6_volts[] = {
414 	REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
415 };
416 
417 /*
418  * LDO7
419  * 1.8 to 3.3V (100mV step)
420  */
421 static const struct linear_range bd71837_ldo7_volts[] = {
422 	REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
423 };
424 
425 struct reg_init {
426 	unsigned int reg;
427 	unsigned int mask;
428 	unsigned int val;
429 };
430 struct bd718xx_regulator_data {
431 	struct regulator_desc desc;
432 	const struct rohm_dvs_config dvs;
433 	const struct reg_init init;
434 	const struct reg_init *additional_inits;
435 	int additional_init_amnt;
436 };
437 
bd718x7_xvp_sanity_check(struct regulator_dev * rdev,int lim_uV,int severity)438 static int bd718x7_xvp_sanity_check(struct regulator_dev *rdev, int lim_uV,
439 				    int severity)
440 {
441 	/*
442 	 * BD71837/47/50 ... (ICs supported by this driver) do not provide
443 	 * warnings, only protection
444 	 */
445 	if (severity != REGULATOR_SEVERITY_PROT) {
446 		dev_err(&rdev->dev,
447 			"Unsupported Under Voltage protection level\n");
448 		return -EINVAL;
449 	}
450 
451 	/*
452 	 * And protection limit is not changeable. It can only be enabled
453 	 * or disabled
454 	 */
455 	if (lim_uV)
456 		return -EINVAL;
457 
458 	return 0;
459 }
460 
bd718x7_set_ldo_uvp(struct regulator_dev * rdev,int lim_uV,int severity,bool enable)461 static int bd718x7_set_ldo_uvp(struct regulator_dev *rdev, int lim_uV,
462 			       int severity, bool enable)
463 {
464 	int ldo_offset = rdev->desc->id - BD718XX_LDO1;
465 	int prot_bit, ret;
466 
467 	ret = bd718x7_xvp_sanity_check(rdev, lim_uV, severity);
468 	if (ret)
469 		return ret;
470 
471 	prot_bit = BD718XX_LDO1_VRMON80 << ldo_offset;
472 
473 	if (enable)
474 		return regmap_clear_bits(rdev->regmap, BD718XX_REG_MVRFLTMASK2,
475 					 prot_bit);
476 
477 	return regmap_set_bits(rdev->regmap, BD718XX_REG_MVRFLTMASK2,
478 			       prot_bit);
479 }
480 
bd718x7_get_buck_prot_reg(int id,int * reg)481 static int bd718x7_get_buck_prot_reg(int id, int *reg)
482 {
483 
484 	if (id > BD718XX_BUCK8) {
485 		WARN_ON(id > BD718XX_BUCK8);
486 		return -EINVAL;
487 	}
488 
489 	if (id > BD718XX_BUCK4)
490 		*reg = BD718XX_REG_MVRFLTMASK0;
491 	else
492 		*reg = BD718XX_REG_MVRFLTMASK1;
493 
494 	return 0;
495 }
496 
bd718x7_get_buck_ovp_info(int id,int * reg,int * bit)497 static int bd718x7_get_buck_ovp_info(int id, int *reg, int *bit)
498 {
499 	int ret;
500 
501 	ret = bd718x7_get_buck_prot_reg(id, reg);
502 	if (ret)
503 		return ret;
504 
505 	*bit = BIT((id % 4) * 2 + 1);
506 
507 	return 0;
508 }
509 
bd718x7_get_buck_uvp_info(int id,int * reg,int * bit)510 static int bd718x7_get_buck_uvp_info(int id, int *reg, int *bit)
511 {
512 	int ret;
513 
514 	ret = bd718x7_get_buck_prot_reg(id, reg);
515 	if (ret)
516 		return ret;
517 
518 	*bit = BIT((id % 4) * 2);
519 
520 	return 0;
521 }
522 
bd718x7_set_buck_uvp(struct regulator_dev * rdev,int lim_uV,int severity,bool enable)523 static int bd718x7_set_buck_uvp(struct regulator_dev *rdev, int lim_uV,
524 				int severity, bool enable)
525 {
526 	int bit, reg, ret;
527 
528 	ret = bd718x7_xvp_sanity_check(rdev, lim_uV, severity);
529 	if (ret)
530 		return ret;
531 
532 	ret = bd718x7_get_buck_uvp_info(rdev->desc->id, &reg, &bit);
533 	if (ret)
534 		return ret;
535 
536 	if (enable)
537 		return regmap_clear_bits(rdev->regmap, reg, bit);
538 
539 	return regmap_set_bits(rdev->regmap, reg, bit);
540 
541 }
542 
bd718x7_set_buck_ovp(struct regulator_dev * rdev,int lim_uV,int severity,bool enable)543 static int bd718x7_set_buck_ovp(struct regulator_dev *rdev, int lim_uV,
544 				int severity,
545 				bool enable)
546 {
547 	int bit, reg, ret;
548 
549 	ret = bd718x7_xvp_sanity_check(rdev, lim_uV, severity);
550 	if (ret)
551 		return ret;
552 
553 	ret = bd718x7_get_buck_ovp_info(rdev->desc->id, &reg, &bit);
554 	if (ret)
555 		return ret;
556 
557 	if (enable)
558 		return regmap_clear_bits(rdev->regmap, reg, bit);
559 
560 	return regmap_set_bits(rdev->regmap, reg, bit);
561 }
562 
563 /*
564  * OPS common for BD71847 and BD71850
565  */
566 BD718XX_OPS(bd718xx_pickable_range_ldo_ops,
567 	    regulator_list_voltage_pickable_linear_range, NULL,
568 	    bd718xx_set_voltage_sel_pickable_restricted,
569 	    regulator_get_voltage_sel_pickable_regmap, NULL, NULL,
570 	    bd718x7_set_ldo_uvp, NULL);
571 
572 /* BD71847 and BD71850 LDO 5 is by default OFF at RUN state */
573 static const struct regulator_ops bd718xx_ldo5_ops_hwstate = {
574 	.is_enabled = never_enabled_by_hwstate,
575 	.list_voltage = regulator_list_voltage_pickable_linear_range,
576 	.set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
577 	.get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
578 	.set_under_voltage_protection = bd718x7_set_ldo_uvp,
579 };
580 
581 BD718XX_OPS(bd718xx_pickable_range_buck_ops,
582 	    regulator_list_voltage_pickable_linear_range, NULL,
583 	    regulator_set_voltage_sel_pickable_regmap,
584 	    regulator_get_voltage_sel_pickable_regmap,
585 	    regulator_set_voltage_time_sel, NULL, bd718x7_set_buck_uvp,
586 	    bd718x7_set_buck_ovp);
587 
588 BD718XX_OPS(bd718xx_ldo_regulator_ops, regulator_list_voltage_linear_range,
589 	    NULL, bd718xx_set_voltage_sel_restricted,
590 	    regulator_get_voltage_sel_regmap, NULL, NULL, bd718x7_set_ldo_uvp,
591 	    NULL);
592 
593 BD718XX_OPS(bd718xx_ldo_regulator_nolinear_ops, regulator_list_voltage_table,
594 	    NULL, bd718xx_set_voltage_sel_restricted,
595 	    regulator_get_voltage_sel_regmap, NULL, NULL, bd718x7_set_ldo_uvp,
596 	    NULL);
597 
598 BD718XX_OPS(bd718xx_buck_regulator_ops, regulator_list_voltage_linear_range,
599 	    NULL, regulator_set_voltage_sel_regmap,
600 	    regulator_get_voltage_sel_regmap, regulator_set_voltage_time_sel,
601 	    NULL, bd718x7_set_buck_uvp, bd718x7_set_buck_ovp);
602 
603 BD718XX_OPS(bd718xx_buck_regulator_nolinear_ops, regulator_list_voltage_table,
604 	    regulator_map_voltage_ascend, regulator_set_voltage_sel_regmap,
605 	    regulator_get_voltage_sel_regmap, regulator_set_voltage_time_sel,
606 	    NULL, bd718x7_set_buck_uvp, bd718x7_set_buck_ovp);
607 
608 /*
609  * OPS for BD71837
610  */
611 BD718XX_OPS(bd71837_pickable_range_ldo_ops,
612 	    regulator_list_voltage_pickable_linear_range, NULL,
613 	    bd71837_set_voltage_sel_pickable_restricted,
614 	    regulator_get_voltage_sel_pickable_regmap, NULL, NULL,
615 	    bd718x7_set_ldo_uvp, NULL);
616 
617 BD718XX_OPS(bd71837_pickable_range_buck_ops,
618 	    regulator_list_voltage_pickable_linear_range, NULL,
619 	    bd71837_set_voltage_sel_pickable_restricted,
620 	    regulator_get_voltage_sel_pickable_regmap,
621 	    regulator_set_voltage_time_sel, NULL, bd718x7_set_buck_uvp,
622 	    bd718x7_set_buck_ovp);
623 
624 BD718XX_OPS(bd71837_ldo_regulator_ops, regulator_list_voltage_linear_range,
625 	    NULL, rohm_regulator_set_voltage_sel_restricted,
626 	    regulator_get_voltage_sel_regmap, NULL, NULL, bd718x7_set_ldo_uvp,
627 	    NULL);
628 
629 BD718XX_OPS(bd71837_ldo_regulator_nolinear_ops, regulator_list_voltage_table,
630 	    NULL, rohm_regulator_set_voltage_sel_restricted,
631 	    regulator_get_voltage_sel_regmap, NULL, NULL, bd718x7_set_ldo_uvp,
632 	    NULL);
633 
634 BD718XX_OPS(bd71837_buck_regulator_ops, regulator_list_voltage_linear_range,
635 	    NULL, rohm_regulator_set_voltage_sel_restricted,
636 	    regulator_get_voltage_sel_regmap, regulator_set_voltage_time_sel,
637 	    NULL, bd718x7_set_buck_uvp, bd718x7_set_buck_ovp);
638 
639 BD718XX_OPS(bd71837_buck_regulator_nolinear_ops, regulator_list_voltage_table,
640 	    regulator_map_voltage_ascend, rohm_regulator_set_voltage_sel_restricted,
641 	    regulator_get_voltage_sel_regmap, regulator_set_voltage_time_sel,
642 	    NULL, bd718x7_set_buck_uvp, bd718x7_set_buck_ovp);
643 /*
644  * BD71837 bucks 3 and 4 support defining their enable/disable state also
645  * when buck enable state is under HW state machine control. In that case the
646  * bit [2] in CTRL register is used to indicate if regulator should be ON.
647  */
648 static const struct regulator_ops bd71837_buck34_ops_hwctrl = {
649 	.is_enabled = bd71837_get_buck34_enable_hwctrl,
650 	.list_voltage = regulator_list_voltage_linear_range,
651 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
652 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
653 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
654 	.set_ramp_delay = regulator_set_ramp_delay_regmap,
655 	.set_under_voltage_protection = bd718x7_set_buck_uvp,
656 	.set_over_voltage_protection = bd718x7_set_buck_ovp,
657 };
658 
659 /*
660  * OPS for all of the ICs - BD718(37/47/50)
661  */
662 BD718XX_OPS(bd718xx_dvs_buck_regulator_ops, regulator_list_voltage_linear_range,
663 	    NULL, regulator_set_voltage_sel_regmap,
664 	    regulator_get_voltage_sel_regmap, regulator_set_voltage_time_sel,
665 	    regulator_set_ramp_delay_regmap, bd718x7_set_buck_uvp,
666 	    bd718x7_set_buck_ovp);
667 
668 
669 
670 /*
671  * There is a HW quirk in BD71837. The shutdown sequence timings for
672  * bucks/LDOs which are controlled via register interface are changed.
673  * At PMIC poweroff the voltage for BUCK6/7 is cut immediately at the
674  * beginning of shut-down sequence. As bucks 6 and 7 are parent
675  * supplies for LDO5 and LDO6 - this causes LDO5/6 voltage
676  * monitoring to errorneously detect under voltage and force PMIC to
677  * emergency state instead of poweroff. In order to avoid this we
678  * disable voltage monitoring for LDO5 and LDO6
679  */
680 static const struct reg_init bd71837_ldo5_inits[] = {
681 	{
682 		.reg = BD718XX_REG_MVRFLTMASK2,
683 		.mask = BD718XX_LDO5_VRMON80,
684 		.val = BD718XX_LDO5_VRMON80,
685 	},
686 };
687 
688 static const struct reg_init bd71837_ldo6_inits[] = {
689 	{
690 		.reg = BD718XX_REG_MVRFLTMASK2,
691 		.mask = BD718XX_LDO6_VRMON80,
692 		.val = BD718XX_LDO6_VRMON80,
693 	},
694 };
695 
buck_set_hw_dvs_levels(struct device_node * np,const struct regulator_desc * desc,struct regulator_config * cfg)696 static int buck_set_hw_dvs_levels(struct device_node *np,
697 			    const struct regulator_desc *desc,
698 			    struct regulator_config *cfg)
699 {
700 	struct bd718xx_regulator_data *data;
701 
702 	data = container_of(desc, struct bd718xx_regulator_data, desc);
703 
704 	return rohm_regulator_set_dvs_levels(&data->dvs, np, desc, cfg->regmap);
705 }
706 
707 static const struct regulator_ops *bd71847_swcontrol_ops[] = {
708 	&bd718xx_dvs_buck_regulator_ops, &bd718xx_dvs_buck_regulator_ops,
709 	&bd718xx_pickable_range_buck_ops, &bd718xx_pickable_range_buck_ops,
710 	&bd718xx_buck_regulator_nolinear_ops, &bd718xx_buck_regulator_ops,
711 	&bd718xx_pickable_range_ldo_ops, &bd718xx_ldo_regulator_nolinear_ops,
712 	&bd718xx_ldo_regulator_ops, &bd718xx_ldo_regulator_ops,
713 	&bd718xx_pickable_range_ldo_ops, &bd718xx_ldo_regulator_ops,
714 };
715 
716 static const struct regulator_ops *bd71847_hwcontrol_ops[] = {
717 	&BD718XX_HWOPNAME(bd718xx_dvs_buck_regulator_ops),
718 	&BD718XX_HWOPNAME(bd718xx_dvs_buck_regulator_ops),
719 	&BD718XX_HWOPNAME(bd718xx_pickable_range_buck_ops),
720 	&BD718XX_HWOPNAME(bd718xx_pickable_range_buck_ops),
721 	&BD718XX_HWOPNAME(bd718xx_buck_regulator_nolinear_ops),
722 	&BD718XX_HWOPNAME(bd718xx_buck_regulator_ops),
723 	&BD718XX_HWOPNAME(bd718xx_pickable_range_ldo_ops),
724 	&BD718XX_HWOPNAME(bd718xx_ldo_regulator_nolinear_ops),
725 	&BD718XX_HWOPNAME(bd718xx_ldo_regulator_ops),
726 	&BD718XX_HWOPNAME(bd718xx_ldo_regulator_ops),
727 	&bd718xx_ldo5_ops_hwstate,
728 	&BD718XX_HWOPNAME(bd718xx_ldo_regulator_ops),
729 };
730 
731 static struct bd718xx_regulator_data bd71847_regulators[] = {
732 	{
733 		.desc = {
734 			.name = "buck1",
735 			.of_match = of_match_ptr("BUCK1"),
736 			.regulators_node = of_match_ptr("regulators"),
737 			.id = BD718XX_BUCK1,
738 			.type = REGULATOR_VOLTAGE,
739 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
740 			.linear_ranges = bd718xx_dvs_buck_volts,
741 			.n_linear_ranges =
742 				ARRAY_SIZE(bd718xx_dvs_buck_volts),
743 			.vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
744 			.vsel_mask = DVS_BUCK_RUN_MASK,
745 			.enable_reg = BD718XX_REG_BUCK1_CTRL,
746 			.enable_mask = BD718XX_BUCK_EN,
747 			.enable_time = BD71847_BUCK1_STARTUP_TIME,
748 			.owner = THIS_MODULE,
749 			.ramp_delay_table = bd718xx_ramp_delay,
750 			.n_ramp_values = ARRAY_SIZE(bd718xx_ramp_delay),
751 			.ramp_reg = BD718XX_REG_BUCK1_CTRL,
752 			.ramp_mask = BUCK_RAMPRATE_MASK,
753 			.of_parse_cb = buck_set_hw_dvs_levels,
754 		},
755 		.dvs = {
756 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
757 				     ROHM_DVS_LEVEL_SUSPEND,
758 			.run_reg = BD718XX_REG_BUCK1_VOLT_RUN,
759 			.run_mask = DVS_BUCK_RUN_MASK,
760 			.idle_reg = BD718XX_REG_BUCK1_VOLT_IDLE,
761 			.idle_mask = DVS_BUCK_RUN_MASK,
762 			.suspend_reg = BD718XX_REG_BUCK1_VOLT_SUSP,
763 			.suspend_mask = DVS_BUCK_RUN_MASK,
764 		},
765 		.init = {
766 			.reg = BD718XX_REG_BUCK1_CTRL,
767 			.mask = BD718XX_BUCK_SEL,
768 			.val = BD718XX_BUCK_SEL,
769 		},
770 	},
771 	{
772 		.desc = {
773 			.name = "buck2",
774 			.of_match = of_match_ptr("BUCK2"),
775 			.regulators_node = of_match_ptr("regulators"),
776 			.id = BD718XX_BUCK2,
777 			.type = REGULATOR_VOLTAGE,
778 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
779 			.linear_ranges = bd718xx_dvs_buck_volts,
780 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
781 			.vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
782 			.vsel_mask = DVS_BUCK_RUN_MASK,
783 			.enable_reg = BD718XX_REG_BUCK2_CTRL,
784 			.enable_mask = BD718XX_BUCK_EN,
785 			.enable_time = BD71847_BUCK2_STARTUP_TIME,
786 			.ramp_delay_table = bd718xx_ramp_delay,
787 			.n_ramp_values = ARRAY_SIZE(bd718xx_ramp_delay),
788 			.ramp_reg = BD718XX_REG_BUCK2_CTRL,
789 			.ramp_mask = BUCK_RAMPRATE_MASK,
790 			.owner = THIS_MODULE,
791 			.of_parse_cb = buck_set_hw_dvs_levels,
792 		},
793 		.dvs = {
794 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE,
795 			.run_reg = BD718XX_REG_BUCK2_VOLT_RUN,
796 			.run_mask = DVS_BUCK_RUN_MASK,
797 			.idle_reg = BD718XX_REG_BUCK2_VOLT_IDLE,
798 			.idle_mask = DVS_BUCK_RUN_MASK,
799 		},
800 		.init = {
801 			.reg = BD718XX_REG_BUCK2_CTRL,
802 			.mask = BD718XX_BUCK_SEL,
803 			.val = BD718XX_BUCK_SEL,
804 		},
805 	},
806 	{
807 		.desc = {
808 			.name = "buck3",
809 			.of_match = of_match_ptr("BUCK3"),
810 			.regulators_node = of_match_ptr("regulators"),
811 			.id = BD718XX_BUCK3,
812 			.type = REGULATOR_VOLTAGE,
813 			.n_voltages = BD71847_BUCK3_VOLTAGE_NUM,
814 			.linear_ranges = bd71847_buck3_volts,
815 			.n_linear_ranges =
816 				ARRAY_SIZE(bd71847_buck3_volts),
817 			.vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
818 			.vsel_mask = BD718XX_1ST_NODVS_BUCK_MASK,
819 			.vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
820 			.vsel_range_mask = BD71847_BUCK3_RANGE_MASK,
821 			.linear_range_selectors_bitfield = bd71847_buck3_volt_range_sel,
822 			.enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
823 			.enable_mask = BD718XX_BUCK_EN,
824 			.enable_time = BD71847_BUCK3_STARTUP_TIME,
825 			.owner = THIS_MODULE,
826 		},
827 		.init = {
828 			.reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
829 			.mask = BD718XX_BUCK_SEL,
830 			.val = BD718XX_BUCK_SEL,
831 		},
832 	},
833 	{
834 		.desc = {
835 			.name = "buck4",
836 			.of_match = of_match_ptr("BUCK4"),
837 			.regulators_node = of_match_ptr("regulators"),
838 			.id = BD718XX_BUCK4,
839 			.type = REGULATOR_VOLTAGE,
840 			.n_voltages = BD71847_BUCK4_VOLTAGE_NUM,
841 			.linear_ranges = bd71847_buck4_volts,
842 			.n_linear_ranges =
843 				ARRAY_SIZE(bd71847_buck4_volts),
844 			.enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
845 			.vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
846 			.vsel_mask = BD71847_BUCK4_MASK,
847 			.vsel_range_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
848 			.vsel_range_mask = BD71847_BUCK4_RANGE_MASK,
849 			.linear_range_selectors_bitfield = bd71847_buck4_volt_range_sel,
850 			.enable_mask = BD718XX_BUCK_EN,
851 			.enable_time = BD71847_BUCK4_STARTUP_TIME,
852 			.owner = THIS_MODULE,
853 		},
854 		.init = {
855 			.reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
856 			.mask = BD718XX_BUCK_SEL,
857 			.val = BD718XX_BUCK_SEL,
858 		},
859 	},
860 	{
861 		.desc = {
862 			.name = "buck5",
863 			.of_match = of_match_ptr("BUCK5"),
864 			.regulators_node = of_match_ptr("regulators"),
865 			.id = BD718XX_BUCK5,
866 			.type = REGULATOR_VOLTAGE,
867 			.volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
868 			.n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
869 			.vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
870 			.vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
871 			.enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
872 			.enable_mask = BD718XX_BUCK_EN,
873 			.enable_time = BD71847_BUCK5_STARTUP_TIME,
874 			.owner = THIS_MODULE,
875 		},
876 		.init = {
877 			.reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
878 			.mask = BD718XX_BUCK_SEL,
879 			.val = BD718XX_BUCK_SEL,
880 		},
881 	},
882 	{
883 		.desc = {
884 			.name = "buck6",
885 			.of_match = of_match_ptr("BUCK6"),
886 			.regulators_node = of_match_ptr("regulators"),
887 			.id = BD718XX_BUCK6,
888 			.type = REGULATOR_VOLTAGE,
889 			.n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
890 			.linear_ranges = bd718xx_4th_nodvs_buck_volts,
891 			.n_linear_ranges =
892 				ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
893 			.vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
894 			.vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
895 			.enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
896 			.enable_mask = BD718XX_BUCK_EN,
897 			.enable_time = BD71847_BUCK6_STARTUP_TIME,
898 			.owner = THIS_MODULE,
899 		},
900 		.init = {
901 			.reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
902 			.mask = BD718XX_BUCK_SEL,
903 			.val = BD718XX_BUCK_SEL,
904 		},
905 	},
906 	{
907 		.desc = {
908 			.name = "ldo1",
909 			.of_match = of_match_ptr("LDO1"),
910 			.regulators_node = of_match_ptr("regulators"),
911 			.id = BD718XX_LDO1,
912 			.type = REGULATOR_VOLTAGE,
913 			.n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
914 			.linear_ranges = bd718xx_ldo1_volts,
915 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
916 			.vsel_reg = BD718XX_REG_LDO1_VOLT,
917 			.vsel_mask = BD718XX_LDO1_MASK,
918 			.vsel_range_reg = BD718XX_REG_LDO1_VOLT,
919 			.vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
920 			.linear_range_selectors_bitfield = bd718xx_ldo1_volt_range_sel,
921 			.enable_reg = BD718XX_REG_LDO1_VOLT,
922 			.enable_mask = BD718XX_LDO_EN,
923 			.enable_time = BD71847_LDO1_STARTUP_TIME,
924 			.owner = THIS_MODULE,
925 		},
926 		.init = {
927 			.reg = BD718XX_REG_LDO1_VOLT,
928 			.mask = BD718XX_LDO_SEL,
929 			.val = BD718XX_LDO_SEL,
930 		},
931 	},
932 	{
933 		.desc = {
934 			.name = "ldo2",
935 			.of_match = of_match_ptr("LDO2"),
936 			.regulators_node = of_match_ptr("regulators"),
937 			.id = BD718XX_LDO2,
938 			.type = REGULATOR_VOLTAGE,
939 			.volt_table = &ldo_2_volts[0],
940 			.vsel_reg = BD718XX_REG_LDO2_VOLT,
941 			.vsel_mask = BD718XX_LDO2_MASK,
942 			.n_voltages = ARRAY_SIZE(ldo_2_volts),
943 			.enable_reg = BD718XX_REG_LDO2_VOLT,
944 			.enable_mask = BD718XX_LDO_EN,
945 			.enable_time = BD71847_LDO2_STARTUP_TIME,
946 			.owner = THIS_MODULE,
947 		},
948 		.init = {
949 			.reg = BD718XX_REG_LDO2_VOLT,
950 			.mask = BD718XX_LDO_SEL,
951 			.val = BD718XX_LDO_SEL,
952 		},
953 	},
954 	{
955 		.desc = {
956 			.name = "ldo3",
957 			.of_match = of_match_ptr("LDO3"),
958 			.regulators_node = of_match_ptr("regulators"),
959 			.id = BD718XX_LDO3,
960 			.type = REGULATOR_VOLTAGE,
961 			.n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
962 			.linear_ranges = bd718xx_ldo3_volts,
963 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
964 			.vsel_reg = BD718XX_REG_LDO3_VOLT,
965 			.vsel_mask = BD718XX_LDO3_MASK,
966 			.enable_reg = BD718XX_REG_LDO3_VOLT,
967 			.enable_mask = BD718XX_LDO_EN,
968 			.enable_time = BD71847_LDO3_STARTUP_TIME,
969 			.owner = THIS_MODULE,
970 		},
971 		.init = {
972 			.reg = BD718XX_REG_LDO3_VOLT,
973 			.mask = BD718XX_LDO_SEL,
974 			.val = BD718XX_LDO_SEL,
975 		},
976 	},
977 	{
978 		.desc = {
979 			.name = "ldo4",
980 			.of_match = of_match_ptr("LDO4"),
981 			.regulators_node = of_match_ptr("regulators"),
982 			.id = BD718XX_LDO4,
983 			.type = REGULATOR_VOLTAGE,
984 			.n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
985 			.linear_ranges = bd718xx_ldo4_volts,
986 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
987 			.vsel_reg = BD718XX_REG_LDO4_VOLT,
988 			.vsel_mask = BD718XX_LDO4_MASK,
989 			.enable_reg = BD718XX_REG_LDO4_VOLT,
990 			.enable_mask = BD718XX_LDO_EN,
991 			.enable_time = BD71847_LDO4_STARTUP_TIME,
992 			.owner = THIS_MODULE,
993 		},
994 		.init = {
995 			.reg = BD718XX_REG_LDO4_VOLT,
996 			.mask = BD718XX_LDO_SEL,
997 			.val = BD718XX_LDO_SEL,
998 		},
999 	},
1000 	{
1001 		.desc = {
1002 			.name = "ldo5",
1003 			.of_match = of_match_ptr("LDO5"),
1004 			.regulators_node = of_match_ptr("regulators"),
1005 			.id = BD718XX_LDO5,
1006 			.type = REGULATOR_VOLTAGE,
1007 			.n_voltages = BD71847_LDO5_VOLTAGE_NUM,
1008 			.linear_ranges = bd71847_ldo5_volts,
1009 			.n_linear_ranges = ARRAY_SIZE(bd71847_ldo5_volts),
1010 			.vsel_reg = BD718XX_REG_LDO5_VOLT,
1011 			.vsel_mask = BD71847_LDO5_MASK,
1012 			.vsel_range_reg = BD718XX_REG_LDO5_VOLT,
1013 			.vsel_range_mask = BD71847_LDO5_RANGE_MASK,
1014 			.linear_range_selectors_bitfield = bd71847_ldo5_volt_range_sel,
1015 			.enable_reg = BD718XX_REG_LDO5_VOLT,
1016 			.enable_mask = BD718XX_LDO_EN,
1017 			.enable_time = BD71847_LDO5_STARTUP_TIME,
1018 			.owner = THIS_MODULE,
1019 		},
1020 		.init = {
1021 			.reg = BD718XX_REG_LDO5_VOLT,
1022 			.mask = BD718XX_LDO_SEL,
1023 			.val = BD718XX_LDO_SEL,
1024 		},
1025 	},
1026 	{
1027 		.desc = {
1028 			.name = "ldo6",
1029 			.of_match = of_match_ptr("LDO6"),
1030 			.regulators_node = of_match_ptr("regulators"),
1031 			.id = BD718XX_LDO6,
1032 			.type = REGULATOR_VOLTAGE,
1033 			.n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
1034 			.linear_ranges = bd718xx_ldo6_volts,
1035 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
1036 			/* LDO6 is supplied by buck5 */
1037 			.supply_name = "buck5",
1038 			.vsel_reg = BD718XX_REG_LDO6_VOLT,
1039 			.vsel_mask = BD718XX_LDO6_MASK,
1040 			.enable_reg = BD718XX_REG_LDO6_VOLT,
1041 			.enable_mask = BD718XX_LDO_EN,
1042 			.enable_time = BD71847_LDO6_STARTUP_TIME,
1043 			.owner = THIS_MODULE,
1044 		},
1045 		.init = {
1046 			.reg = BD718XX_REG_LDO6_VOLT,
1047 			.mask = BD718XX_LDO_SEL,
1048 			.val = BD718XX_LDO_SEL,
1049 		},
1050 	},
1051 };
1052 
1053 static const struct regulator_ops *bd71837_swcontrol_ops[] = {
1054 	&bd718xx_dvs_buck_regulator_ops, &bd718xx_dvs_buck_regulator_ops,
1055 	&bd718xx_dvs_buck_regulator_ops, &bd718xx_dvs_buck_regulator_ops,
1056 	&bd71837_pickable_range_buck_ops, &bd71837_buck_regulator_ops,
1057 	&bd71837_buck_regulator_nolinear_ops, &bd71837_buck_regulator_ops,
1058 	&bd71837_pickable_range_ldo_ops, &bd71837_ldo_regulator_nolinear_ops,
1059 	&bd71837_ldo_regulator_ops, &bd71837_ldo_regulator_ops,
1060 	&bd71837_ldo_regulator_ops, &bd71837_ldo_regulator_ops,
1061 	&bd71837_ldo_regulator_ops,
1062 };
1063 
1064 static const struct regulator_ops *bd71837_hwcontrol_ops[] = {
1065 	&BD718XX_HWOPNAME(bd718xx_dvs_buck_regulator_ops),
1066 	&BD718XX_HWOPNAME(bd718xx_dvs_buck_regulator_ops),
1067 	&bd71837_buck34_ops_hwctrl, &bd71837_buck34_ops_hwctrl,
1068 	&BD718XX_HWOPNAME(bd71837_pickable_range_buck_ops),
1069 	&BD718XX_HWOPNAME(bd71837_buck_regulator_ops),
1070 	&BD718XX_HWOPNAME(bd71837_buck_regulator_nolinear_ops),
1071 	&BD718XX_HWOPNAME(bd71837_buck_regulator_ops),
1072 	&BD718XX_HWOPNAME(bd71837_pickable_range_ldo_ops),
1073 	&BD718XX_HWOPNAME(bd71837_ldo_regulator_nolinear_ops),
1074 	&BD718XX_HWOPNAME(bd71837_ldo_regulator_ops),
1075 	&BD718XX_HWOPNAME(bd71837_ldo_regulator_ops),
1076 	&BD718XX_HWOPNAME(bd71837_ldo_regulator_ops),
1077 	&BD718XX_HWOPNAME(bd71837_ldo_regulator_ops),
1078 	&BD718XX_HWOPNAME(bd71837_ldo_regulator_ops),
1079 };
1080 
1081 static struct bd718xx_regulator_data bd71837_regulators[] = {
1082 	{
1083 		.desc = {
1084 			.name = "buck1",
1085 			.of_match = of_match_ptr("BUCK1"),
1086 			.regulators_node = of_match_ptr("regulators"),
1087 			.id = BD718XX_BUCK1,
1088 			.type = REGULATOR_VOLTAGE,
1089 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
1090 			.linear_ranges = bd718xx_dvs_buck_volts,
1091 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
1092 			.vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
1093 			.vsel_mask = DVS_BUCK_RUN_MASK,
1094 			.enable_reg = BD718XX_REG_BUCK1_CTRL,
1095 			.enable_mask = BD718XX_BUCK_EN,
1096 			.enable_time = BD71837_BUCK1_STARTUP_TIME,
1097 			.ramp_delay_table = bd718xx_ramp_delay,
1098 			.n_ramp_values = ARRAY_SIZE(bd718xx_ramp_delay),
1099 			.ramp_reg = BD718XX_REG_BUCK1_CTRL,
1100 			.ramp_mask = BUCK_RAMPRATE_MASK,
1101 			.owner = THIS_MODULE,
1102 			.of_parse_cb = buck_set_hw_dvs_levels,
1103 		},
1104 		.dvs = {
1105 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
1106 				     ROHM_DVS_LEVEL_SUSPEND,
1107 			.run_reg = BD718XX_REG_BUCK1_VOLT_RUN,
1108 			.run_mask = DVS_BUCK_RUN_MASK,
1109 			.idle_reg = BD718XX_REG_BUCK1_VOLT_IDLE,
1110 			.idle_mask = DVS_BUCK_RUN_MASK,
1111 			.suspend_reg = BD718XX_REG_BUCK1_VOLT_SUSP,
1112 			.suspend_mask = DVS_BUCK_RUN_MASK,
1113 		},
1114 		.init = {
1115 			.reg = BD718XX_REG_BUCK1_CTRL,
1116 			.mask = BD718XX_BUCK_SEL,
1117 			.val = BD718XX_BUCK_SEL,
1118 		},
1119 	},
1120 	{
1121 		.desc = {
1122 			.name = "buck2",
1123 			.of_match = of_match_ptr("BUCK2"),
1124 			.regulators_node = of_match_ptr("regulators"),
1125 			.id = BD718XX_BUCK2,
1126 			.type = REGULATOR_VOLTAGE,
1127 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
1128 			.linear_ranges = bd718xx_dvs_buck_volts,
1129 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
1130 			.vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
1131 			.vsel_mask = DVS_BUCK_RUN_MASK,
1132 			.enable_reg = BD718XX_REG_BUCK2_CTRL,
1133 			.enable_mask = BD718XX_BUCK_EN,
1134 			.enable_time = BD71837_BUCK2_STARTUP_TIME,
1135 			.ramp_delay_table = bd718xx_ramp_delay,
1136 			.n_ramp_values = ARRAY_SIZE(bd718xx_ramp_delay),
1137 			.ramp_reg = BD718XX_REG_BUCK2_CTRL,
1138 			.ramp_mask = BUCK_RAMPRATE_MASK,
1139 			.owner = THIS_MODULE,
1140 			.of_parse_cb = buck_set_hw_dvs_levels,
1141 		},
1142 		.dvs = {
1143 			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE,
1144 			.run_reg = BD718XX_REG_BUCK2_VOLT_RUN,
1145 			.run_mask = DVS_BUCK_RUN_MASK,
1146 			.idle_reg = BD718XX_REG_BUCK2_VOLT_IDLE,
1147 			.idle_mask = DVS_BUCK_RUN_MASK,
1148 		},
1149 		.init = {
1150 			.reg = BD718XX_REG_BUCK2_CTRL,
1151 			.mask = BD718XX_BUCK_SEL,
1152 			.val = BD718XX_BUCK_SEL,
1153 		},
1154 	},
1155 	{
1156 		.desc = {
1157 			.name = "buck3",
1158 			.of_match = of_match_ptr("BUCK3"),
1159 			.regulators_node = of_match_ptr("regulators"),
1160 			.id = BD718XX_BUCK3,
1161 			.type = REGULATOR_VOLTAGE,
1162 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
1163 			.linear_ranges = bd718xx_dvs_buck_volts,
1164 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
1165 			.vsel_reg = BD71837_REG_BUCK3_VOLT_RUN,
1166 			.vsel_mask = DVS_BUCK_RUN_MASK,
1167 			.enable_reg = BD71837_REG_BUCK3_CTRL,
1168 			.enable_mask = BD718XX_BUCK_EN,
1169 			.enable_time = BD71837_BUCK3_STARTUP_TIME,
1170 			.ramp_delay_table = bd718xx_ramp_delay,
1171 			.n_ramp_values = ARRAY_SIZE(bd718xx_ramp_delay),
1172 			.ramp_reg = BD71837_REG_BUCK3_CTRL,
1173 			.ramp_mask = BUCK_RAMPRATE_MASK,
1174 			.owner = THIS_MODULE,
1175 			.of_parse_cb = buck_set_hw_dvs_levels,
1176 		},
1177 		.dvs = {
1178 			.level_map = ROHM_DVS_LEVEL_RUN,
1179 			.run_reg = BD71837_REG_BUCK3_VOLT_RUN,
1180 			.run_mask = DVS_BUCK_RUN_MASK,
1181 		},
1182 		.init = {
1183 			.reg = BD71837_REG_BUCK3_CTRL,
1184 			.mask = BD718XX_BUCK_SEL,
1185 			.val = BD718XX_BUCK_SEL,
1186 		},
1187 	},
1188 	{
1189 		.desc = {
1190 			.name = "buck4",
1191 			.of_match = of_match_ptr("BUCK4"),
1192 			.regulators_node = of_match_ptr("regulators"),
1193 			.id = BD718XX_BUCK4,
1194 			.type = REGULATOR_VOLTAGE,
1195 			.n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
1196 			.linear_ranges = bd718xx_dvs_buck_volts,
1197 			.n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
1198 			.vsel_reg = BD71837_REG_BUCK4_VOLT_RUN,
1199 			.vsel_mask = DVS_BUCK_RUN_MASK,
1200 			.enable_reg = BD71837_REG_BUCK4_CTRL,
1201 			.enable_mask = BD718XX_BUCK_EN,
1202 			.enable_time = BD71837_BUCK4_STARTUP_TIME,
1203 			.ramp_delay_table = bd718xx_ramp_delay,
1204 			.n_ramp_values = ARRAY_SIZE(bd718xx_ramp_delay),
1205 			.ramp_reg = BD71837_REG_BUCK4_CTRL,
1206 			.ramp_mask = BUCK_RAMPRATE_MASK,
1207 			.owner = THIS_MODULE,
1208 			.of_parse_cb = buck_set_hw_dvs_levels,
1209 		},
1210 		.dvs = {
1211 			.level_map = ROHM_DVS_LEVEL_RUN,
1212 			.run_reg = BD71837_REG_BUCK4_VOLT_RUN,
1213 			.run_mask = DVS_BUCK_RUN_MASK,
1214 		},
1215 		.init = {
1216 			.reg = BD71837_REG_BUCK4_CTRL,
1217 			.mask = BD718XX_BUCK_SEL,
1218 			.val = BD718XX_BUCK_SEL,
1219 		},
1220 	},
1221 	{
1222 		.desc = {
1223 			.name = "buck5",
1224 			.of_match = of_match_ptr("BUCK5"),
1225 			.regulators_node = of_match_ptr("regulators"),
1226 			.id = BD718XX_BUCK5,
1227 			.type = REGULATOR_VOLTAGE,
1228 			.n_voltages = BD71837_BUCK5_VOLTAGE_NUM,
1229 			.linear_ranges = bd71837_buck5_volts,
1230 			.n_linear_ranges =
1231 				ARRAY_SIZE(bd71837_buck5_volts),
1232 			.vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
1233 			.vsel_mask = BD71837_BUCK5_MASK,
1234 			.vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
1235 			.vsel_range_mask = BD71837_BUCK5_RANGE_MASK,
1236 			.linear_range_selectors_bitfield = bd71837_buck5_volt_range_sel,
1237 			.enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
1238 			.enable_mask = BD718XX_BUCK_EN,
1239 			.enable_time = BD71837_BUCK5_STARTUP_TIME,
1240 			.owner = THIS_MODULE,
1241 		},
1242 		.init = {
1243 			.reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
1244 			.mask = BD718XX_BUCK_SEL,
1245 			.val = BD718XX_BUCK_SEL,
1246 		},
1247 	},
1248 	{
1249 		.desc = {
1250 			.name = "buck6",
1251 			.of_match = of_match_ptr("BUCK6"),
1252 			.regulators_node = of_match_ptr("regulators"),
1253 			.id = BD718XX_BUCK6,
1254 			.type = REGULATOR_VOLTAGE,
1255 			.n_voltages = BD71837_BUCK6_VOLTAGE_NUM,
1256 			.linear_ranges = bd71837_buck6_volts,
1257 			.n_linear_ranges =
1258 				ARRAY_SIZE(bd71837_buck6_volts),
1259 			.vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
1260 			.vsel_mask = BD71837_BUCK6_MASK,
1261 			.enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
1262 			.enable_mask = BD718XX_BUCK_EN,
1263 			.enable_time = BD71837_BUCK6_STARTUP_TIME,
1264 			.owner = THIS_MODULE,
1265 		},
1266 		.init = {
1267 			.reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
1268 			.mask = BD718XX_BUCK_SEL,
1269 			.val = BD718XX_BUCK_SEL,
1270 		},
1271 	},
1272 	{
1273 		.desc = {
1274 			.name = "buck7",
1275 			.of_match = of_match_ptr("BUCK7"),
1276 			.regulators_node = of_match_ptr("regulators"),
1277 			.id = BD718XX_BUCK7,
1278 			.type = REGULATOR_VOLTAGE,
1279 			.volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
1280 			.n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
1281 			.vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
1282 			.vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
1283 			.enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
1284 			.enable_mask = BD718XX_BUCK_EN,
1285 			.enable_time = BD71837_BUCK7_STARTUP_TIME,
1286 			.owner = THIS_MODULE,
1287 		},
1288 		.init = {
1289 			.reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
1290 			.mask = BD718XX_BUCK_SEL,
1291 			.val = BD718XX_BUCK_SEL,
1292 		},
1293 	},
1294 	{
1295 		.desc = {
1296 			.name = "buck8",
1297 			.of_match = of_match_ptr("BUCK8"),
1298 			.regulators_node = of_match_ptr("regulators"),
1299 			.id = BD718XX_BUCK8,
1300 			.type = REGULATOR_VOLTAGE,
1301 			.n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
1302 			.linear_ranges = bd718xx_4th_nodvs_buck_volts,
1303 			.n_linear_ranges =
1304 				ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
1305 			.vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
1306 			.vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
1307 			.enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
1308 			.enable_mask = BD718XX_BUCK_EN,
1309 			.enable_time = BD71837_BUCK8_STARTUP_TIME,
1310 			.owner = THIS_MODULE,
1311 		},
1312 		.init = {
1313 			.reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
1314 			.mask = BD718XX_BUCK_SEL,
1315 			.val = BD718XX_BUCK_SEL,
1316 		},
1317 	},
1318 	{
1319 		.desc = {
1320 			.name = "ldo1",
1321 			.of_match = of_match_ptr("LDO1"),
1322 			.regulators_node = of_match_ptr("regulators"),
1323 			.id = BD718XX_LDO1,
1324 			.type = REGULATOR_VOLTAGE,
1325 			.n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
1326 			.linear_ranges = bd718xx_ldo1_volts,
1327 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
1328 			.vsel_reg = BD718XX_REG_LDO1_VOLT,
1329 			.vsel_mask = BD718XX_LDO1_MASK,
1330 			.vsel_range_reg = BD718XX_REG_LDO1_VOLT,
1331 			.vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
1332 			.linear_range_selectors_bitfield = bd718xx_ldo1_volt_range_sel,
1333 			.enable_reg = BD718XX_REG_LDO1_VOLT,
1334 			.enable_mask = BD718XX_LDO_EN,
1335 			.enable_time = BD71837_LDO1_STARTUP_TIME,
1336 			.owner = THIS_MODULE,
1337 		},
1338 		.init = {
1339 			.reg = BD718XX_REG_LDO1_VOLT,
1340 			.mask = BD718XX_LDO_SEL,
1341 			.val = BD718XX_LDO_SEL,
1342 		},
1343 	},
1344 	{
1345 		.desc = {
1346 			.name = "ldo2",
1347 			.of_match = of_match_ptr("LDO2"),
1348 			.regulators_node = of_match_ptr("regulators"),
1349 			.id = BD718XX_LDO2,
1350 			.type = REGULATOR_VOLTAGE,
1351 			.volt_table = &ldo_2_volts[0],
1352 			.vsel_reg = BD718XX_REG_LDO2_VOLT,
1353 			.vsel_mask = BD718XX_LDO2_MASK,
1354 			.n_voltages = ARRAY_SIZE(ldo_2_volts),
1355 			.enable_reg = BD718XX_REG_LDO2_VOLT,
1356 			.enable_mask = BD718XX_LDO_EN,
1357 			.enable_time = BD71837_LDO2_STARTUP_TIME,
1358 			.owner = THIS_MODULE,
1359 		},
1360 		.init = {
1361 			.reg = BD718XX_REG_LDO2_VOLT,
1362 			.mask = BD718XX_LDO_SEL,
1363 			.val = BD718XX_LDO_SEL,
1364 		},
1365 	},
1366 	{
1367 		.desc = {
1368 			.name = "ldo3",
1369 			.of_match = of_match_ptr("LDO3"),
1370 			.regulators_node = of_match_ptr("regulators"),
1371 			.id = BD718XX_LDO3,
1372 			.type = REGULATOR_VOLTAGE,
1373 			.n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
1374 			.linear_ranges = bd718xx_ldo3_volts,
1375 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
1376 			.vsel_reg = BD718XX_REG_LDO3_VOLT,
1377 			.vsel_mask = BD718XX_LDO3_MASK,
1378 			.enable_reg = BD718XX_REG_LDO3_VOLT,
1379 			.enable_mask = BD718XX_LDO_EN,
1380 			.enable_time = BD71837_LDO3_STARTUP_TIME,
1381 			.owner = THIS_MODULE,
1382 		},
1383 		.init = {
1384 			.reg = BD718XX_REG_LDO3_VOLT,
1385 			.mask = BD718XX_LDO_SEL,
1386 			.val = BD718XX_LDO_SEL,
1387 		},
1388 	},
1389 	{
1390 		.desc = {
1391 			.name = "ldo4",
1392 			.of_match = of_match_ptr("LDO4"),
1393 			.regulators_node = of_match_ptr("regulators"),
1394 			.id = BD718XX_LDO4,
1395 			.type = REGULATOR_VOLTAGE,
1396 			.n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
1397 			.linear_ranges = bd718xx_ldo4_volts,
1398 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
1399 			.vsel_reg = BD718XX_REG_LDO4_VOLT,
1400 			.vsel_mask = BD718XX_LDO4_MASK,
1401 			.enable_reg = BD718XX_REG_LDO4_VOLT,
1402 			.enable_mask = BD718XX_LDO_EN,
1403 			.enable_time = BD71837_LDO4_STARTUP_TIME,
1404 			.owner = THIS_MODULE,
1405 		},
1406 		.init = {
1407 			.reg = BD718XX_REG_LDO4_VOLT,
1408 			.mask = BD718XX_LDO_SEL,
1409 			.val = BD718XX_LDO_SEL,
1410 		},
1411 	},
1412 	{
1413 		.desc = {
1414 			.name = "ldo5",
1415 			.of_match = of_match_ptr("LDO5"),
1416 			.regulators_node = of_match_ptr("regulators"),
1417 			.id = BD718XX_LDO5,
1418 			.type = REGULATOR_VOLTAGE,
1419 			.n_voltages = BD71837_LDO5_VOLTAGE_NUM,
1420 			.linear_ranges = bd71837_ldo5_volts,
1421 			.n_linear_ranges = ARRAY_SIZE(bd71837_ldo5_volts),
1422 			/* LDO5 is supplied by buck6 */
1423 			.supply_name = "buck6",
1424 			.vsel_reg = BD718XX_REG_LDO5_VOLT,
1425 			.vsel_mask = BD71837_LDO5_MASK,
1426 			.enable_reg = BD718XX_REG_LDO5_VOLT,
1427 			.enable_mask = BD718XX_LDO_EN,
1428 			.enable_time = BD71837_LDO5_STARTUP_TIME,
1429 			.owner = THIS_MODULE,
1430 		},
1431 		.init = {
1432 			.reg = BD718XX_REG_LDO5_VOLT,
1433 			.mask = BD718XX_LDO_SEL,
1434 			.val = BD718XX_LDO_SEL,
1435 		},
1436 		.additional_inits = bd71837_ldo5_inits,
1437 		.additional_init_amnt = ARRAY_SIZE(bd71837_ldo5_inits),
1438 	},
1439 	{
1440 		.desc = {
1441 			.name = "ldo6",
1442 			.of_match = of_match_ptr("LDO6"),
1443 			.regulators_node = of_match_ptr("regulators"),
1444 			.id = BD718XX_LDO6,
1445 			.type = REGULATOR_VOLTAGE,
1446 			.n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
1447 			.linear_ranges = bd718xx_ldo6_volts,
1448 			.n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
1449 			/* LDO6 is supplied by buck7 */
1450 			.supply_name = "buck7",
1451 			.vsel_reg = BD718XX_REG_LDO6_VOLT,
1452 			.vsel_mask = BD718XX_LDO6_MASK,
1453 			.enable_reg = BD718XX_REG_LDO6_VOLT,
1454 			.enable_mask = BD718XX_LDO_EN,
1455 			.enable_time = BD71837_LDO6_STARTUP_TIME,
1456 			.owner = THIS_MODULE,
1457 		},
1458 		.init = {
1459 			.reg = BD718XX_REG_LDO6_VOLT,
1460 			.mask = BD718XX_LDO_SEL,
1461 			.val = BD718XX_LDO_SEL,
1462 		},
1463 		.additional_inits = bd71837_ldo6_inits,
1464 		.additional_init_amnt = ARRAY_SIZE(bd71837_ldo6_inits),
1465 	},
1466 	{
1467 		.desc = {
1468 			.name = "ldo7",
1469 			.of_match = of_match_ptr("LDO7"),
1470 			.regulators_node = of_match_ptr("regulators"),
1471 			.id = BD718XX_LDO7,
1472 			.type = REGULATOR_VOLTAGE,
1473 			.n_voltages = BD71837_LDO7_VOLTAGE_NUM,
1474 			.linear_ranges = bd71837_ldo7_volts,
1475 			.n_linear_ranges = ARRAY_SIZE(bd71837_ldo7_volts),
1476 			.vsel_reg = BD71837_REG_LDO7_VOLT,
1477 			.vsel_mask = BD71837_LDO7_MASK,
1478 			.enable_reg = BD71837_REG_LDO7_VOLT,
1479 			.enable_mask = BD718XX_LDO_EN,
1480 			.enable_time = BD71837_LDO7_STARTUP_TIME,
1481 			.owner = THIS_MODULE,
1482 		},
1483 		.init = {
1484 			.reg = BD71837_REG_LDO7_VOLT,
1485 			.mask = BD718XX_LDO_SEL,
1486 			.val = BD718XX_LDO_SEL,
1487 		},
1488 	},
1489 };
1490 
mark_hw_controlled(struct device * dev,struct device_node * np,struct bd718xx_regulator_data * reg_data,unsigned int num_reg_data,int * info)1491 static void mark_hw_controlled(struct device *dev, struct device_node *np,
1492 			       struct bd718xx_regulator_data *reg_data,
1493 			       unsigned int num_reg_data, int *info)
1494 {
1495 	int i;
1496 
1497 	for (i = 1; i <= num_reg_data; i++) {
1498 		if (!of_node_name_eq(np, reg_data[i-1].desc.of_match))
1499 			continue;
1500 
1501 		*info |= 1 << (i - 1);
1502 		dev_dbg(dev, "regulator %d runlevel controlled\n", i);
1503 		return;
1504 	}
1505 	dev_warn(dev, "Bad regulator node\n");
1506 }
1507 
1508 /*
1509  * Setups where regulator (especially the buck8) output voltage is scaled
1510  * by adding external connection where some other regulator output is connected
1511  * to feedback-pin (over suitable resistors) is getting popular amongst users
1512  * of BD71837. (This allows for example scaling down the buck8 voltages to suit
1513  * lover GPU voltages for projects where buck8 is (ab)used to supply power
1514  * for GPU. Additionally some setups do allow DVS for buck8 but as this do
1515  * produce voltage spikes the HW must be evaluated to be able to survive this
1516  * - hence I keep the DVS disabled for non DVS bucks by default. I don't want
1517  * to help you burn your proto board)
1518  *
1519  * So we allow describing this external connection from DT and scale the
1520  * voltages accordingly. This is what the connection should look like:
1521  *
1522  * |------------|
1523  * |	buck 8  |-------+----->Vout
1524  * |		|	|
1525  * |------------|	|
1526  *	| FB pin	|
1527  *	|		|
1528  *	+-------+--R2---+
1529  *		|
1530  *		R1
1531  *		|
1532  *	V FB-pull-up
1533  *
1534  *	Here the buck output is sifted according to formula:
1535  *
1536  * Vout_o = Vo - (Vpu - Vo)*R2/R1
1537  * Linear_step = step_orig*(R1+R2)/R1
1538  *
1539  * where:
1540  * Vout_o is adjusted voltage output at vsel reg value 0
1541  * Vo is original voltage output at vsel reg value 0
1542  * Vpu is the pull-up voltage V FB-pull-up in the picture
1543  * R1 and R2 are resistor values.
1544  *
1545  * As a real world example for buck8 and a specific GPU:
1546  * VLDO = 1.6V (used as FB-pull-up)
1547  * R1 = 1000ohms
1548  * R2 = 150ohms
1549  * VSEL 0x0 => 0.8V – (VLDO – 0.8) * R2 / R1 = 0.68V
1550  * Linear Step = 10mV * (R1 + R2) / R1 = 11.5mV
1551  */
setup_feedback_loop(struct device * dev,struct device_node * np,struct bd718xx_regulator_data * reg_data,unsigned int num_reg_data,int fb_uv)1552 static int setup_feedback_loop(struct device *dev, struct device_node *np,
1553 			       struct bd718xx_regulator_data *reg_data,
1554 			       unsigned int num_reg_data, int fb_uv)
1555 {
1556 	int i, r1, r2, ret;
1557 
1558 	/*
1559 	 * We do adjust the values in the global desc based on DT settings.
1560 	 * This may not be best approach as it can cause problems if more than
1561 	 * one PMIC is controlled from same processor. I don't see such use-case
1562 	 * for BD718x7 now - so we spare some bits.
1563 	 *
1564 	 * If this will point out to be a problem - then we can allocate new
1565 	 * bd718xx_regulator_data array at probe and just use the global
1566 	 * array as a template where we copy initial values. Then we can
1567 	 * use allocated descs for regultor registration and do IC specific
1568 	 * modifications to this copy while leaving other PMICs untouched. But
1569 	 * that means allocating new array for each PMIC - and currently I see
1570 	 * no need for that.
1571 	 */
1572 
1573 	for (i = 0; i < num_reg_data; i++) {
1574 		struct regulator_desc *desc = &reg_data[i].desc;
1575 		int j;
1576 
1577 		if (!of_node_name_eq(np, desc->of_match))
1578 			continue;
1579 
1580 		/* The feedback loop connection does not make sense for LDOs */
1581 		if (desc->id >= BD718XX_LDO1)
1582 			return -EINVAL;
1583 
1584 		ret = of_property_read_u32(np, "rohm,feedback-pull-up-r1-ohms",
1585 					   &r1);
1586 		if (ret)
1587 			return ret;
1588 
1589 		if (!r1)
1590 			return -EINVAL;
1591 
1592 		ret = of_property_read_u32(np, "rohm,feedback-pull-up-r2-ohms",
1593 					   &r2);
1594 		if (ret)
1595 			return ret;
1596 
1597 		if (desc->n_linear_ranges && desc->linear_ranges) {
1598 			struct linear_range *new;
1599 
1600 			new = devm_kzalloc(dev, desc->n_linear_ranges *
1601 					   sizeof(struct linear_range),
1602 					   GFP_KERNEL);
1603 			if (!new)
1604 				return -ENOMEM;
1605 
1606 			for (j = 0; j < desc->n_linear_ranges; j++) {
1607 				int min = desc->linear_ranges[j].min;
1608 				int step = desc->linear_ranges[j].step;
1609 
1610 				min -= (fb_uv - min)*r2/r1;
1611 				step = step * (r1 + r2);
1612 				step /= r1;
1613 
1614 				new[j].min = min;
1615 				new[j].step = step;
1616 
1617 				dev_dbg(dev, "%s: old range min %d, step %d\n",
1618 					desc->name, desc->linear_ranges[j].min,
1619 					desc->linear_ranges[j].step);
1620 				dev_dbg(dev, "new range min %d, step %d\n", min,
1621 					step);
1622 			}
1623 			desc->linear_ranges = new;
1624 		}
1625 		dev_dbg(dev, "regulator '%s' has FB pull-up configured\n",
1626 			desc->name);
1627 
1628 		return 0;
1629 	}
1630 
1631 	return -ENODEV;
1632 }
1633 
get_special_regulators(struct device * dev,struct bd718xx_regulator_data * reg_data,unsigned int num_reg_data,int * info)1634 static int get_special_regulators(struct device *dev,
1635 				  struct bd718xx_regulator_data *reg_data,
1636 				  unsigned int num_reg_data, int *info)
1637 {
1638 	int ret;
1639 	int uv;
1640 
1641 	*info = 0;
1642 
1643 	struct device_node *nproot __free(device_node) = of_get_child_by_name(dev->of_node,
1644 									      "regulators");
1645 	if (!nproot) {
1646 		dev_err(dev, "failed to find regulators node\n");
1647 		return -ENODEV;
1648 	}
1649 	for_each_child_of_node_scoped(nproot, np) {
1650 		if (of_property_read_bool(np, "rohm,no-regulator-enable-control"))
1651 			mark_hw_controlled(dev, np, reg_data, num_reg_data,
1652 					   info);
1653 		ret = of_property_read_u32(np, "rohm,fb-pull-up-microvolt",
1654 					   &uv);
1655 		if (ret) {
1656 			if (ret == -EINVAL)
1657 				continue;
1658 			else
1659 				return ret;
1660 		}
1661 
1662 		ret = setup_feedback_loop(dev, np, reg_data, num_reg_data, uv);
1663 		if (ret)
1664 			return ret;
1665 	}
1666 
1667 	return 0;
1668 }
1669 
bd718xx_probe(struct platform_device * pdev)1670 static int bd718xx_probe(struct platform_device *pdev)
1671 {
1672 	struct regmap *regmap;
1673 	struct regulator_config config = { 0 };
1674 	int i, j, err, omit_enable;
1675 	bool use_snvs;
1676 	struct bd718xx_regulator_data *reg_data;
1677 	unsigned int num_reg_data;
1678 	enum rohm_chip_type chip = platform_get_device_id(pdev)->driver_data;
1679 	const struct regulator_ops **swops, **hwops;
1680 
1681 	regmap = dev_get_regmap(pdev->dev.parent, NULL);
1682 	if (!regmap) {
1683 		dev_err(&pdev->dev, "No MFD driver data\n");
1684 		return -EINVAL;
1685 	}
1686 
1687 	switch (chip) {
1688 	case ROHM_CHIP_TYPE_BD71837:
1689 		reg_data = bd71837_regulators;
1690 		num_reg_data = ARRAY_SIZE(bd71837_regulators);
1691 		swops = &bd71837_swcontrol_ops[0];
1692 		hwops = &bd71837_hwcontrol_ops[0];
1693 		break;
1694 	case ROHM_CHIP_TYPE_BD71847:
1695 		reg_data = bd71847_regulators;
1696 		num_reg_data = ARRAY_SIZE(bd71847_regulators);
1697 		swops = &bd71847_swcontrol_ops[0];
1698 		hwops = &bd71847_hwcontrol_ops[0];
1699 		break;
1700 	default:
1701 		dev_err(&pdev->dev, "Unsupported chip type\n");
1702 		return -EINVAL;
1703 	}
1704 
1705 	/* Register LOCK release */
1706 	err = regmap_update_bits(regmap, BD718XX_REG_REGLOCK,
1707 				 (REGLOCK_PWRSEQ | REGLOCK_VREG), 0);
1708 	if (err)
1709 		return dev_err_probe(&pdev->dev, err, "Failed to unlock PMIC\n");
1710 
1711 	dev_dbg(&pdev->dev, "Unlocked lock register 0x%x\n",
1712 		BD718XX_REG_REGLOCK);
1713 
1714 	use_snvs = of_property_read_bool(pdev->dev.parent->of_node,
1715 					 "rohm,reset-snvs-powered");
1716 
1717 	/*
1718 	 * Change the next stage from poweroff to be READY instead of SNVS
1719 	 * for all reset types because OTP loading at READY will clear SEL
1720 	 * bit allowing HW defaults for power rails to be used
1721 	 */
1722 	if (!use_snvs) {
1723 		err = regmap_update_bits(regmap, BD718XX_REG_TRANS_COND1,
1724 					 BD718XX_ON_REQ_POWEROFF_MASK |
1725 					 BD718XX_SWRESET_POWEROFF_MASK |
1726 					 BD718XX_WDOG_POWEROFF_MASK |
1727 					 BD718XX_KEY_L_POWEROFF_MASK,
1728 					 BD718XX_POWOFF_TO_RDY);
1729 		if (err)
1730 			return dev_err_probe(&pdev->dev, err,
1731 					     "Failed to change reset target\n");
1732 
1733 		dev_dbg(&pdev->dev, "Changed all resets from SVNS to READY\n");
1734 	}
1735 
1736 	config.dev = pdev->dev.parent;
1737 	config.regmap = regmap;
1738 	/*
1739 	 * There are cases when we want to leave the enable-control for
1740 	 * the HW state machine and use this driver only for voltage control.
1741 	 * One special case is when we use PMIC_STBY_REQ line from SoC to PMIC
1742 	 * in order to set the system to SUSPEND state.
1743 	 *
1744 	 * If regulator is taken under SW control the regulator state will not
1745 	 * be affected by PMIC state machine - Eg. regulator is likely to stay
1746 	 * on even in SUSPEND
1747 	 */
1748 	err = get_special_regulators(pdev->dev.parent, reg_data, num_reg_data,
1749 				     &omit_enable);
1750 	if (err)
1751 		return err;
1752 
1753 	for (i = 0; i < num_reg_data; i++) {
1754 
1755 		struct regulator_desc *desc;
1756 		struct regulator_dev *rdev;
1757 		struct bd718xx_regulator_data *r;
1758 		int no_enable_control = omit_enable & (1 << i);
1759 
1760 		r = &reg_data[i];
1761 		desc = &r->desc;
1762 
1763 		if (no_enable_control)
1764 			desc->ops = hwops[i];
1765 		else
1766 			desc->ops = swops[i];
1767 
1768 		rdev = devm_regulator_register(&pdev->dev, desc, &config);
1769 		if (IS_ERR(rdev))
1770 			return dev_err_probe(&pdev->dev, PTR_ERR(rdev),
1771 					     "failed to register %s regulator\n",
1772 					     desc->name);
1773 
1774 		/*
1775 		 * Regulator register gets the regulator constraints and
1776 		 * applies them (set_machine_constraints). This should have
1777 		 * turned the control register(s) to correct values and we
1778 		 * can now switch the control from PMIC state machine to the
1779 		 * register interface
1780 		 *
1781 		 * At poweroff transition PMIC HW disables EN bit for
1782 		 * regulators but leaves SEL bit untouched. So if state
1783 		 * transition from POWEROFF is done to SNVS - then all power
1784 		 * rails controlled by SW (having SEL bit set) stay disabled
1785 		 * as EN is cleared. This will result boot failure if any
1786 		 * crucial systems are powered by these rails. We don't
1787 		 * enable SW control for crucial regulators if snvs state is
1788 		 * used
1789 		 */
1790 		if (!no_enable_control && (!use_snvs ||
1791 		    !rdev->constraints->always_on ||
1792 		    !rdev->constraints->boot_on)) {
1793 			err = regmap_update_bits(regmap, r->init.reg,
1794 						 r->init.mask, r->init.val);
1795 			if (err)
1796 				return dev_err_probe(&pdev->dev, err,
1797 					"Failed to take control for (%s)\n",
1798 					desc->name);
1799 		}
1800 		for (j = 0; j < r->additional_init_amnt; j++) {
1801 			err = regmap_update_bits(regmap,
1802 						 r->additional_inits[j].reg,
1803 						 r->additional_inits[j].mask,
1804 						 r->additional_inits[j].val);
1805 			if (err)
1806 				return dev_err_probe(&pdev->dev, err,
1807 					"Buck (%s) initialization failed\n",
1808 					desc->name);
1809 		}
1810 	}
1811 
1812 	return err;
1813 }
1814 
1815 static const struct platform_device_id bd718x7_pmic_id[] = {
1816 	{ "bd71837-pmic", ROHM_CHIP_TYPE_BD71837 },
1817 	{ "bd71847-pmic", ROHM_CHIP_TYPE_BD71847 },
1818 	{ },
1819 };
1820 MODULE_DEVICE_TABLE(platform, bd718x7_pmic_id);
1821 
1822 static struct platform_driver bd718xx_regulator = {
1823 	.driver = {
1824 		.name = "bd718xx-pmic",
1825 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1826 	},
1827 	.probe = bd718xx_probe,
1828 	.id_table = bd718x7_pmic_id,
1829 };
1830 
1831 module_platform_driver(bd718xx_regulator);
1832 
1833 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1834 MODULE_DESCRIPTION("BD71837/BD71847 voltage regulator driver");
1835 MODULE_LICENSE("GPL");
1836 MODULE_ALIAS("platform:bd718xx-pmic");
1837