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