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