1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (C) 2018 ROHM Semiconductors
3 // bd71837-regulator.c ROHM BD71837MWV/BD71847MWV regulator driver
5 #include <linux/delay.h>
7 #include <linux/interrupt.h>
8 #include <linux/kernel.h>
9 #include <linux/mfd/rohm-bd718x7.h>
10 #include <linux/module.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>
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
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
50 * BUCK1RAMPRATE[1:0] BUCK1 DVS ramp rate setting
51 * 00: 10.00mV/usec 10mV 1uS
52 * 01: 5.00mV/usec 10mV 2uS
53 * 10: 2.50mV/usec 10mV 4uS
54 * 11: 1.25mV/usec 10mV 8uS
56 static int bd718xx_buck1234_set_ramp_delay(struct regulator_dev *rdev,
59 int id = rdev_get_id(rdev);
60 unsigned int ramp_value;
62 dev_dbg(&rdev->dev, "Buck[%d] Set Ramp = %d\n", id + 1,
66 ramp_value = BUCK_RAMPRATE_1P25MV;
69 ramp_value = BUCK_RAMPRATE_2P50MV;
72 ramp_value = BUCK_RAMPRATE_5P00MV;
75 ramp_value = BUCK_RAMPRATE_10P00MV;
78 ramp_value = BUCK_RAMPRATE_10P00MV;
80 "%s: ramp_delay: %d not supported, setting 10000mV//us\n",
81 rdev->desc->name, ramp_delay);
84 return regmap_update_bits(rdev->regmap, BD718XX_REG_BUCK1_CTRL + id,
85 BUCK_RAMPRATE_MASK, ramp_value << 6);
88 /* Bucks 1 to 4 support DVS. PWM mode is used when voltage is changed.
89 * Bucks 5 to 8 and LDOs can use PFM and must be disabled when voltage
90 * is changed. Hence we return -EBUSY for these if voltage is changed
91 * when BUCK/LDO is enabled.
93 static int bd718xx_set_voltage_sel_restricted(struct regulator_dev *rdev,
96 if (regulator_is_enabled_regmap(rdev))
99 return regulator_set_voltage_sel_regmap(rdev, sel);
102 static int bd718xx_set_voltage_sel_pickable_restricted(
103 struct regulator_dev *rdev, unsigned int sel)
105 if (regulator_is_enabled_regmap(rdev))
108 return regulator_set_voltage_sel_pickable_regmap(rdev, sel);
111 static const struct regulator_ops bd718xx_pickable_range_ldo_ops = {
112 .enable = regulator_enable_regmap,
113 .disable = regulator_disable_regmap,
114 .is_enabled = regulator_is_enabled_regmap,
115 .list_voltage = regulator_list_voltage_pickable_linear_range,
116 .set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
117 .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
120 static const struct regulator_ops bd718xx_pickable_range_buck_ops = {
121 .enable = regulator_enable_regmap,
122 .disable = regulator_disable_regmap,
123 .is_enabled = regulator_is_enabled_regmap,
124 .list_voltage = regulator_list_voltage_pickable_linear_range,
125 .set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
126 .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
127 .set_voltage_time_sel = regulator_set_voltage_time_sel,
130 static const struct regulator_ops bd718xx_ldo_regulator_ops = {
131 .enable = regulator_enable_regmap,
132 .disable = regulator_disable_regmap,
133 .is_enabled = regulator_is_enabled_regmap,
134 .list_voltage = regulator_list_voltage_linear_range,
135 .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
136 .get_voltage_sel = regulator_get_voltage_sel_regmap,
139 static const struct regulator_ops bd718xx_ldo_regulator_nolinear_ops = {
140 .enable = regulator_enable_regmap,
141 .disable = regulator_disable_regmap,
142 .is_enabled = regulator_is_enabled_regmap,
143 .list_voltage = regulator_list_voltage_table,
144 .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
145 .get_voltage_sel = regulator_get_voltage_sel_regmap,
148 static const struct regulator_ops bd718xx_buck_regulator_ops = {
149 .enable = regulator_enable_regmap,
150 .disable = regulator_disable_regmap,
151 .is_enabled = regulator_is_enabled_regmap,
152 .list_voltage = regulator_list_voltage_linear_range,
153 .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
154 .get_voltage_sel = regulator_get_voltage_sel_regmap,
155 .set_voltage_time_sel = regulator_set_voltage_time_sel,
158 static const struct regulator_ops bd718xx_buck_regulator_nolinear_ops = {
159 .enable = regulator_enable_regmap,
160 .disable = regulator_disable_regmap,
161 .is_enabled = regulator_is_enabled_regmap,
162 .list_voltage = regulator_list_voltage_table,
163 .map_voltage = regulator_map_voltage_ascend,
164 .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
165 .get_voltage_sel = regulator_get_voltage_sel_regmap,
166 .set_voltage_time_sel = regulator_set_voltage_time_sel,
169 static const struct regulator_ops bd718xx_dvs_buck_regulator_ops = {
170 .enable = regulator_enable_regmap,
171 .disable = regulator_disable_regmap,
172 .is_enabled = regulator_is_enabled_regmap,
173 .list_voltage = regulator_list_voltage_linear_range,
174 .set_voltage_sel = regulator_set_voltage_sel_regmap,
175 .get_voltage_sel = regulator_get_voltage_sel_regmap,
176 .set_voltage_time_sel = regulator_set_voltage_time_sel,
177 .set_ramp_delay = bd718xx_buck1234_set_ramp_delay,
181 * BD71837 BUCK1/2/3/4
183 * 0.70 to 1.30V (10mV step)
185 static const struct regulator_linear_range bd718xx_dvs_buck_volts[] = {
186 REGULATOR_LINEAR_RANGE(700000, 0x00, 0x3C, 10000),
187 REGULATOR_LINEAR_RANGE(1300000, 0x3D, 0x3F, 0),
192 * 0.7V to 1.35V (range 0)
194 * 0.675 to 1.325 (range 1)
196 static const struct regulator_linear_range bd71837_buck5_volts[] = {
197 /* Ranges when VOLT_SEL bit is 0 */
198 REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
199 REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
200 REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
201 /* Ranges when VOLT_SEL bit is 1 */
202 REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
203 REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
204 REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
208 * Range selector for first 3 linear ranges is 0x0
209 * and 0x1 for last 3 ranges.
211 static const unsigned int bd71837_buck5_volt_range_sel[] = {
212 0x0, 0x0, 0x0, 0x80, 0x80, 0x80
218 static const struct regulator_linear_range bd71847_buck3_volts[] = {
219 /* Ranges when VOLT_SEL bits are 00 */
220 REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
221 REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
222 REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
223 /* Ranges when VOLT_SEL bits are 01 */
224 REGULATOR_LINEAR_RANGE(550000, 0x0, 0x7, 50000),
225 /* Ranges when VOLT_SEL bits are 11 */
226 REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
227 REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
228 REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
231 static const unsigned int bd71847_buck3_volt_range_sel[] = {
232 0x0, 0x0, 0x0, 0x40, 0x80, 0x80, 0x80
235 static const struct regulator_linear_range bd71847_buck4_volts[] = {
236 REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
237 REGULATOR_LINEAR_RANGE(2600000, 0x00, 0x03, 100000),
240 static const unsigned int bd71847_buck4_volt_range_sel[] = { 0x0, 0x40 };
244 * 3.0V to 3.3V (step 100mV)
246 static const struct regulator_linear_range bd71837_buck6_volts[] = {
247 REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
256 * 011 = 1.8V (Initial)
262 static const unsigned int bd718xx_3rd_nodvs_buck_volts[] = {
263 1605000, 1695000, 1755000, 1800000, 1845000, 1905000, 1950000, 1995000
268 * 0.8V to 1.40V (step 10mV)
270 static const struct regulator_linear_range bd718xx_4th_nodvs_buck_volts[] = {
271 REGULATOR_LINEAR_RANGE(800000, 0x00, 0x3C, 10000),
276 * 3.0 to 3.3V (100mV step)
278 static const struct regulator_linear_range bd718xx_ldo1_volts[] = {
279 REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
280 REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000),
283 static const unsigned int bd718xx_ldo1_volt_range_sel[] = { 0x0, 0x20 };
289 static const unsigned int ldo_2_volts[] = {
295 * 1.8 to 3.3V (100mV step)
297 static const struct regulator_linear_range bd718xx_ldo3_volts[] = {
298 REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
303 * 0.9 to 1.8V (100mV step)
305 static const struct regulator_linear_range bd718xx_ldo4_volts[] = {
306 REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
311 * 1.8 to 3.3V (100mV step)
313 static const struct regulator_linear_range bd71837_ldo5_volts[] = {
314 REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
319 * 1.8 to 3.3V (100mV step)
321 static const struct regulator_linear_range bd71847_ldo5_volts[] = {
322 REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
323 REGULATOR_LINEAR_RANGE(800000, 0x00, 0x0F, 100000),
326 static const unsigned int bd71847_ldo5_volt_range_sel[] = { 0x0, 0x20 };
330 * 0.9 to 1.8V (100mV step)
332 static const struct regulator_linear_range bd718xx_ldo6_volts[] = {
333 REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
338 * 1.8 to 3.3V (100mV step)
340 static const struct regulator_linear_range bd71837_ldo7_volts[] = {
341 REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
349 struct bd718xx_regulator_data {
350 struct regulator_desc desc;
351 const struct reg_init init;
352 const struct reg_init *additional_inits;
353 int additional_init_amnt;
357 * There is a HW quirk in BD71837. The shutdown sequence timings for
358 * bucks/LDOs which are controlled via register interface are changed.
359 * At PMIC poweroff the voltage for BUCK6/7 is cut immediately at the
360 * beginning of shut-down sequence. As bucks 6 and 7 are parent
361 * supplies for LDO5 and LDO6 - this causes LDO5/6 voltage
362 * monitoring to errorneously detect under voltage and force PMIC to
363 * emergency state instead of poweroff. In order to avoid this we
364 * disable voltage monitoring for LDO5 and LDO6
366 static const struct reg_init bd71837_ldo5_inits[] = {
368 .reg = BD718XX_REG_MVRFLTMASK2,
369 .mask = BD718XX_LDO5_VRMON80,
370 .val = BD718XX_LDO5_VRMON80,
374 static const struct reg_init bd71837_ldo6_inits[] = {
376 .reg = BD718XX_REG_MVRFLTMASK2,
377 .mask = BD718XX_LDO6_VRMON80,
378 .val = BD718XX_LDO6_VRMON80,
382 #define NUM_DVS_BUCKS 4
384 struct of_dvs_setting {
389 static int set_dvs_levels(const struct of_dvs_setting *dvs,
390 struct device_node *np,
391 const struct regulator_desc *desc,
392 struct regmap *regmap)
397 ret = of_property_read_u32(np, dvs->prop, &uv);
404 for (i = 0; i < desc->n_voltages; i++) {
405 ret = regulator_desc_list_voltage_linear_range(desc, i);
409 i <<= ffs(desc->vsel_mask) - 1;
410 ret = regmap_update_bits(regmap, dvs->reg,
411 DVS_BUCK_RUN_MASK, i);
418 static int buck4_set_hw_dvs_levels(struct device_node *np,
419 const struct regulator_desc *desc,
420 struct regulator_config *cfg)
423 const struct of_dvs_setting dvs[] = {
425 .prop = "rohm,dvs-run-voltage",
426 .reg = BD71837_REG_BUCK4_VOLT_RUN,
430 for (i = 0; i < ARRAY_SIZE(dvs); i++) {
431 ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
437 static int buck3_set_hw_dvs_levels(struct device_node *np,
438 const struct regulator_desc *desc,
439 struct regulator_config *cfg)
442 const struct of_dvs_setting dvs[] = {
444 .prop = "rohm,dvs-run-voltage",
445 .reg = BD71837_REG_BUCK3_VOLT_RUN,
449 for (i = 0; i < ARRAY_SIZE(dvs); i++) {
450 ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
457 static int buck2_set_hw_dvs_levels(struct device_node *np,
458 const struct regulator_desc *desc,
459 struct regulator_config *cfg)
462 const struct of_dvs_setting dvs[] = {
464 .prop = "rohm,dvs-run-voltage",
465 .reg = BD718XX_REG_BUCK2_VOLT_RUN,
468 .prop = "rohm,dvs-idle-voltage",
469 .reg = BD718XX_REG_BUCK2_VOLT_IDLE,
475 for (i = 0; i < ARRAY_SIZE(dvs); i++) {
476 ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
483 static int buck1_set_hw_dvs_levels(struct device_node *np,
484 const struct regulator_desc *desc,
485 struct regulator_config *cfg)
488 const struct of_dvs_setting dvs[] = {
490 .prop = "rohm,dvs-run-voltage",
491 .reg = BD718XX_REG_BUCK1_VOLT_RUN,
494 .prop = "rohm,dvs-idle-voltage",
495 .reg = BD718XX_REG_BUCK1_VOLT_IDLE,
498 .prop = "rohm,dvs-suspend-voltage",
499 .reg = BD718XX_REG_BUCK1_VOLT_SUSP,
503 for (i = 0; i < ARRAY_SIZE(dvs); i++) {
504 ret = set_dvs_levels(&dvs[i], np, desc, cfg->regmap);
511 static const struct bd718xx_regulator_data bd71847_regulators[] = {
515 .of_match = of_match_ptr("BUCK1"),
516 .regulators_node = of_match_ptr("regulators"),
518 .ops = &bd718xx_dvs_buck_regulator_ops,
519 .type = REGULATOR_VOLTAGE,
520 .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
521 .linear_ranges = bd718xx_dvs_buck_volts,
523 ARRAY_SIZE(bd718xx_dvs_buck_volts),
524 .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
525 .vsel_mask = DVS_BUCK_RUN_MASK,
526 .enable_reg = BD718XX_REG_BUCK1_CTRL,
527 .enable_mask = BD718XX_BUCK_EN,
528 .enable_time = BD71847_BUCK1_STARTUP_TIME,
529 .owner = THIS_MODULE,
530 .of_parse_cb = buck1_set_hw_dvs_levels,
533 .reg = BD718XX_REG_BUCK1_CTRL,
534 .mask = BD718XX_BUCK_SEL,
535 .val = BD718XX_BUCK_SEL,
541 .of_match = of_match_ptr("BUCK2"),
542 .regulators_node = of_match_ptr("regulators"),
544 .ops = &bd718xx_dvs_buck_regulator_ops,
545 .type = REGULATOR_VOLTAGE,
546 .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
547 .linear_ranges = bd718xx_dvs_buck_volts,
548 .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
549 .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
550 .vsel_mask = DVS_BUCK_RUN_MASK,
551 .enable_reg = BD718XX_REG_BUCK2_CTRL,
552 .enable_mask = BD718XX_BUCK_EN,
553 .enable_time = BD71847_BUCK2_STARTUP_TIME,
554 .owner = THIS_MODULE,
555 .of_parse_cb = buck2_set_hw_dvs_levels,
558 .reg = BD718XX_REG_BUCK2_CTRL,
559 .mask = BD718XX_BUCK_SEL,
560 .val = BD718XX_BUCK_SEL,
566 .of_match = of_match_ptr("BUCK3"),
567 .regulators_node = of_match_ptr("regulators"),
569 .ops = &bd718xx_pickable_range_buck_ops,
570 .type = REGULATOR_VOLTAGE,
571 .n_voltages = BD71847_BUCK3_VOLTAGE_NUM,
572 .linear_ranges = bd71847_buck3_volts,
574 ARRAY_SIZE(bd71847_buck3_volts),
575 .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
576 .vsel_mask = BD718XX_1ST_NODVS_BUCK_MASK,
577 .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
578 .vsel_range_mask = BD71847_BUCK3_RANGE_MASK,
579 .linear_range_selectors = bd71847_buck3_volt_range_sel,
580 .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
581 .enable_mask = BD718XX_BUCK_EN,
582 .enable_time = BD71847_BUCK3_STARTUP_TIME,
583 .owner = THIS_MODULE,
586 .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
587 .mask = BD718XX_BUCK_SEL,
588 .val = BD718XX_BUCK_SEL,
594 .of_match = of_match_ptr("BUCK4"),
595 .regulators_node = of_match_ptr("regulators"),
597 .ops = &bd718xx_pickable_range_buck_ops,
598 .type = REGULATOR_VOLTAGE,
599 .n_voltages = BD71847_BUCK4_VOLTAGE_NUM,
600 .linear_ranges = bd71847_buck4_volts,
602 ARRAY_SIZE(bd71847_buck4_volts),
603 .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
604 .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
605 .vsel_mask = BD71847_BUCK4_MASK,
606 .vsel_range_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
607 .vsel_range_mask = BD71847_BUCK4_RANGE_MASK,
608 .linear_range_selectors = bd71847_buck4_volt_range_sel,
609 .enable_mask = BD718XX_BUCK_EN,
610 .enable_time = BD71847_BUCK4_STARTUP_TIME,
611 .owner = THIS_MODULE,
614 .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
615 .mask = BD718XX_BUCK_SEL,
616 .val = BD718XX_BUCK_SEL,
622 .of_match = of_match_ptr("BUCK5"),
623 .regulators_node = of_match_ptr("regulators"),
625 .ops = &bd718xx_buck_regulator_nolinear_ops,
626 .type = REGULATOR_VOLTAGE,
627 .volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
628 .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
629 .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
630 .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
631 .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
632 .enable_mask = BD718XX_BUCK_EN,
633 .enable_time = BD71847_BUCK5_STARTUP_TIME,
634 .owner = THIS_MODULE,
637 .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
638 .mask = BD718XX_BUCK_SEL,
639 .val = BD718XX_BUCK_SEL,
645 .of_match = of_match_ptr("BUCK6"),
646 .regulators_node = of_match_ptr("regulators"),
648 .ops = &bd718xx_buck_regulator_ops,
649 .type = REGULATOR_VOLTAGE,
650 .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
651 .linear_ranges = bd718xx_4th_nodvs_buck_volts,
653 ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
654 .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
655 .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
656 .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
657 .enable_mask = BD718XX_BUCK_EN,
658 .enable_time = BD71847_BUCK6_STARTUP_TIME,
659 .owner = THIS_MODULE,
662 .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
663 .mask = BD718XX_BUCK_SEL,
664 .val = BD718XX_BUCK_SEL,
670 .of_match = of_match_ptr("LDO1"),
671 .regulators_node = of_match_ptr("regulators"),
673 .ops = &bd718xx_pickable_range_ldo_ops,
674 .type = REGULATOR_VOLTAGE,
675 .n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
676 .linear_ranges = bd718xx_ldo1_volts,
677 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
678 .vsel_reg = BD718XX_REG_LDO1_VOLT,
679 .vsel_mask = BD718XX_LDO1_MASK,
680 .vsel_range_reg = BD718XX_REG_LDO1_VOLT,
681 .vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
682 .linear_range_selectors = bd718xx_ldo1_volt_range_sel,
683 .enable_reg = BD718XX_REG_LDO1_VOLT,
684 .enable_mask = BD718XX_LDO_EN,
685 .enable_time = BD71847_LDO1_STARTUP_TIME,
686 .owner = THIS_MODULE,
689 .reg = BD718XX_REG_LDO1_VOLT,
690 .mask = BD718XX_LDO_SEL,
691 .val = BD718XX_LDO_SEL,
697 .of_match = of_match_ptr("LDO2"),
698 .regulators_node = of_match_ptr("regulators"),
700 .ops = &bd718xx_ldo_regulator_nolinear_ops,
701 .type = REGULATOR_VOLTAGE,
702 .volt_table = &ldo_2_volts[0],
703 .vsel_reg = BD718XX_REG_LDO2_VOLT,
704 .vsel_mask = BD718XX_LDO2_MASK,
705 .n_voltages = ARRAY_SIZE(ldo_2_volts),
706 .enable_reg = BD718XX_REG_LDO2_VOLT,
707 .enable_mask = BD718XX_LDO_EN,
708 .enable_time = BD71847_LDO2_STARTUP_TIME,
709 .owner = THIS_MODULE,
712 .reg = BD718XX_REG_LDO2_VOLT,
713 .mask = BD718XX_LDO_SEL,
714 .val = BD718XX_LDO_SEL,
720 .of_match = of_match_ptr("LDO3"),
721 .regulators_node = of_match_ptr("regulators"),
723 .ops = &bd718xx_ldo_regulator_ops,
724 .type = REGULATOR_VOLTAGE,
725 .n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
726 .linear_ranges = bd718xx_ldo3_volts,
727 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
728 .vsel_reg = BD718XX_REG_LDO3_VOLT,
729 .vsel_mask = BD718XX_LDO3_MASK,
730 .enable_reg = BD718XX_REG_LDO3_VOLT,
731 .enable_mask = BD718XX_LDO_EN,
732 .enable_time = BD71847_LDO3_STARTUP_TIME,
733 .owner = THIS_MODULE,
736 .reg = BD718XX_REG_LDO3_VOLT,
737 .mask = BD718XX_LDO_SEL,
738 .val = BD718XX_LDO_SEL,
744 .of_match = of_match_ptr("LDO4"),
745 .regulators_node = of_match_ptr("regulators"),
747 .ops = &bd718xx_ldo_regulator_ops,
748 .type = REGULATOR_VOLTAGE,
749 .n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
750 .linear_ranges = bd718xx_ldo4_volts,
751 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
752 .vsel_reg = BD718XX_REG_LDO4_VOLT,
753 .vsel_mask = BD718XX_LDO4_MASK,
754 .enable_reg = BD718XX_REG_LDO4_VOLT,
755 .enable_mask = BD718XX_LDO_EN,
756 .enable_time = BD71847_LDO4_STARTUP_TIME,
757 .owner = THIS_MODULE,
760 .reg = BD718XX_REG_LDO4_VOLT,
761 .mask = BD718XX_LDO_SEL,
762 .val = BD718XX_LDO_SEL,
768 .of_match = of_match_ptr("LDO5"),
769 .regulators_node = of_match_ptr("regulators"),
771 .ops = &bd718xx_pickable_range_ldo_ops,
772 .type = REGULATOR_VOLTAGE,
773 .n_voltages = BD71847_LDO5_VOLTAGE_NUM,
774 .linear_ranges = bd71847_ldo5_volts,
775 .n_linear_ranges = ARRAY_SIZE(bd71847_ldo5_volts),
776 .vsel_reg = BD718XX_REG_LDO5_VOLT,
777 .vsel_mask = BD71847_LDO5_MASK,
778 .vsel_range_reg = BD718XX_REG_LDO5_VOLT,
779 .vsel_range_mask = BD71847_LDO5_RANGE_MASK,
780 .linear_range_selectors = bd71847_ldo5_volt_range_sel,
781 .enable_reg = BD718XX_REG_LDO5_VOLT,
782 .enable_mask = BD718XX_LDO_EN,
783 .enable_time = BD71847_LDO5_STARTUP_TIME,
784 .owner = THIS_MODULE,
787 .reg = BD718XX_REG_LDO5_VOLT,
788 .mask = BD718XX_LDO_SEL,
789 .val = BD718XX_LDO_SEL,
795 .of_match = of_match_ptr("LDO6"),
796 .regulators_node = of_match_ptr("regulators"),
798 .ops = &bd718xx_ldo_regulator_ops,
799 .type = REGULATOR_VOLTAGE,
800 .n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
801 .linear_ranges = bd718xx_ldo6_volts,
802 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
803 /* LDO6 is supplied by buck5 */
804 .supply_name = "buck5",
805 .vsel_reg = BD718XX_REG_LDO6_VOLT,
806 .vsel_mask = BD718XX_LDO6_MASK,
807 .enable_reg = BD718XX_REG_LDO6_VOLT,
808 .enable_mask = BD718XX_LDO_EN,
809 .enable_time = BD71847_LDO6_STARTUP_TIME,
810 .owner = THIS_MODULE,
813 .reg = BD718XX_REG_LDO6_VOLT,
814 .mask = BD718XX_LDO_SEL,
815 .val = BD718XX_LDO_SEL,
820 static const struct bd718xx_regulator_data bd71837_regulators[] = {
824 .of_match = of_match_ptr("BUCK1"),
825 .regulators_node = of_match_ptr("regulators"),
827 .ops = &bd718xx_dvs_buck_regulator_ops,
828 .type = REGULATOR_VOLTAGE,
829 .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
830 .linear_ranges = bd718xx_dvs_buck_volts,
831 .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
832 .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
833 .vsel_mask = DVS_BUCK_RUN_MASK,
834 .enable_reg = BD718XX_REG_BUCK1_CTRL,
835 .enable_mask = BD718XX_BUCK_EN,
836 .enable_time = BD71837_BUCK1_STARTUP_TIME,
837 .owner = THIS_MODULE,
838 .of_parse_cb = buck1_set_hw_dvs_levels,
841 .reg = BD718XX_REG_BUCK1_CTRL,
842 .mask = BD718XX_BUCK_SEL,
843 .val = BD718XX_BUCK_SEL,
849 .of_match = of_match_ptr("BUCK2"),
850 .regulators_node = of_match_ptr("regulators"),
852 .ops = &bd718xx_dvs_buck_regulator_ops,
853 .type = REGULATOR_VOLTAGE,
854 .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
855 .linear_ranges = bd718xx_dvs_buck_volts,
856 .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
857 .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
858 .vsel_mask = DVS_BUCK_RUN_MASK,
859 .enable_reg = BD718XX_REG_BUCK2_CTRL,
860 .enable_mask = BD718XX_BUCK_EN,
861 .enable_time = BD71837_BUCK2_STARTUP_TIME,
862 .owner = THIS_MODULE,
863 .of_parse_cb = buck2_set_hw_dvs_levels,
866 .reg = BD718XX_REG_BUCK2_CTRL,
867 .mask = BD718XX_BUCK_SEL,
868 .val = BD718XX_BUCK_SEL,
874 .of_match = of_match_ptr("BUCK3"),
875 .regulators_node = of_match_ptr("regulators"),
877 .ops = &bd718xx_dvs_buck_regulator_ops,
878 .type = REGULATOR_VOLTAGE,
879 .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
880 .linear_ranges = bd718xx_dvs_buck_volts,
881 .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
882 .vsel_reg = BD71837_REG_BUCK3_VOLT_RUN,
883 .vsel_mask = DVS_BUCK_RUN_MASK,
884 .enable_reg = BD71837_REG_BUCK3_CTRL,
885 .enable_mask = BD718XX_BUCK_EN,
886 .enable_time = BD71837_BUCK3_STARTUP_TIME,
887 .owner = THIS_MODULE,
888 .of_parse_cb = buck3_set_hw_dvs_levels,
891 .reg = BD71837_REG_BUCK3_CTRL,
892 .mask = BD718XX_BUCK_SEL,
893 .val = BD718XX_BUCK_SEL,
899 .of_match = of_match_ptr("BUCK4"),
900 .regulators_node = of_match_ptr("regulators"),
902 .ops = &bd718xx_dvs_buck_regulator_ops,
903 .type = REGULATOR_VOLTAGE,
904 .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
905 .linear_ranges = bd718xx_dvs_buck_volts,
906 .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
907 .vsel_reg = BD71837_REG_BUCK4_VOLT_RUN,
908 .vsel_mask = DVS_BUCK_RUN_MASK,
909 .enable_reg = BD71837_REG_BUCK4_CTRL,
910 .enable_mask = BD718XX_BUCK_EN,
911 .enable_time = BD71837_BUCK4_STARTUP_TIME,
912 .owner = THIS_MODULE,
913 .of_parse_cb = buck4_set_hw_dvs_levels,
916 .reg = BD71837_REG_BUCK4_CTRL,
917 .mask = BD718XX_BUCK_SEL,
918 .val = BD718XX_BUCK_SEL,
924 .of_match = of_match_ptr("BUCK5"),
925 .regulators_node = of_match_ptr("regulators"),
927 .ops = &bd718xx_pickable_range_buck_ops,
928 .type = REGULATOR_VOLTAGE,
929 .n_voltages = BD71837_BUCK5_VOLTAGE_NUM,
930 .linear_ranges = bd71837_buck5_volts,
932 ARRAY_SIZE(bd71837_buck5_volts),
933 .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
934 .vsel_mask = BD71837_BUCK5_MASK,
935 .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
936 .vsel_range_mask = BD71837_BUCK5_RANGE_MASK,
937 .linear_range_selectors = bd71837_buck5_volt_range_sel,
938 .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
939 .enable_mask = BD718XX_BUCK_EN,
940 .enable_time = BD71837_BUCK5_STARTUP_TIME,
941 .owner = THIS_MODULE,
944 .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
945 .mask = BD718XX_BUCK_SEL,
946 .val = BD718XX_BUCK_SEL,
952 .of_match = of_match_ptr("BUCK6"),
953 .regulators_node = of_match_ptr("regulators"),
955 .ops = &bd718xx_buck_regulator_ops,
956 .type = REGULATOR_VOLTAGE,
957 .n_voltages = BD71837_BUCK6_VOLTAGE_NUM,
958 .linear_ranges = bd71837_buck6_volts,
960 ARRAY_SIZE(bd71837_buck6_volts),
961 .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
962 .vsel_mask = BD71837_BUCK6_MASK,
963 .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
964 .enable_mask = BD718XX_BUCK_EN,
965 .enable_time = BD71837_BUCK6_STARTUP_TIME,
966 .owner = THIS_MODULE,
969 .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
970 .mask = BD718XX_BUCK_SEL,
971 .val = BD718XX_BUCK_SEL,
977 .of_match = of_match_ptr("BUCK7"),
978 .regulators_node = of_match_ptr("regulators"),
980 .ops = &bd718xx_buck_regulator_nolinear_ops,
981 .type = REGULATOR_VOLTAGE,
982 .volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
983 .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
984 .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
985 .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
986 .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
987 .enable_mask = BD718XX_BUCK_EN,
988 .enable_time = BD71837_BUCK7_STARTUP_TIME,
989 .owner = THIS_MODULE,
992 .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
993 .mask = BD718XX_BUCK_SEL,
994 .val = BD718XX_BUCK_SEL,
1000 .of_match = of_match_ptr("BUCK8"),
1001 .regulators_node = of_match_ptr("regulators"),
1002 .id = BD718XX_BUCK8,
1003 .ops = &bd718xx_buck_regulator_ops,
1004 .type = REGULATOR_VOLTAGE,
1005 .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
1006 .linear_ranges = bd718xx_4th_nodvs_buck_volts,
1008 ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
1009 .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
1010 .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
1011 .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
1012 .enable_mask = BD718XX_BUCK_EN,
1013 .enable_time = BD71837_BUCK8_STARTUP_TIME,
1014 .owner = THIS_MODULE,
1017 .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
1018 .mask = BD718XX_BUCK_SEL,
1019 .val = BD718XX_BUCK_SEL,
1025 .of_match = of_match_ptr("LDO1"),
1026 .regulators_node = of_match_ptr("regulators"),
1028 .ops = &bd718xx_pickable_range_ldo_ops,
1029 .type = REGULATOR_VOLTAGE,
1030 .n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
1031 .linear_ranges = bd718xx_ldo1_volts,
1032 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
1033 .vsel_reg = BD718XX_REG_LDO1_VOLT,
1034 .vsel_mask = BD718XX_LDO1_MASK,
1035 .vsel_range_reg = BD718XX_REG_LDO1_VOLT,
1036 .vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
1037 .linear_range_selectors = bd718xx_ldo1_volt_range_sel,
1038 .enable_reg = BD718XX_REG_LDO1_VOLT,
1039 .enable_mask = BD718XX_LDO_EN,
1040 .enable_time = BD71837_LDO1_STARTUP_TIME,
1041 .owner = THIS_MODULE,
1044 .reg = BD718XX_REG_LDO1_VOLT,
1045 .mask = BD718XX_LDO_SEL,
1046 .val = BD718XX_LDO_SEL,
1052 .of_match = of_match_ptr("LDO2"),
1053 .regulators_node = of_match_ptr("regulators"),
1055 .ops = &bd718xx_ldo_regulator_nolinear_ops,
1056 .type = REGULATOR_VOLTAGE,
1057 .volt_table = &ldo_2_volts[0],
1058 .vsel_reg = BD718XX_REG_LDO2_VOLT,
1059 .vsel_mask = BD718XX_LDO2_MASK,
1060 .n_voltages = ARRAY_SIZE(ldo_2_volts),
1061 .enable_reg = BD718XX_REG_LDO2_VOLT,
1062 .enable_mask = BD718XX_LDO_EN,
1063 .enable_time = BD71837_LDO2_STARTUP_TIME,
1064 .owner = THIS_MODULE,
1067 .reg = BD718XX_REG_LDO2_VOLT,
1068 .mask = BD718XX_LDO_SEL,
1069 .val = BD718XX_LDO_SEL,
1075 .of_match = of_match_ptr("LDO3"),
1076 .regulators_node = of_match_ptr("regulators"),
1078 .ops = &bd718xx_ldo_regulator_ops,
1079 .type = REGULATOR_VOLTAGE,
1080 .n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
1081 .linear_ranges = bd718xx_ldo3_volts,
1082 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
1083 .vsel_reg = BD718XX_REG_LDO3_VOLT,
1084 .vsel_mask = BD718XX_LDO3_MASK,
1085 .enable_reg = BD718XX_REG_LDO3_VOLT,
1086 .enable_mask = BD718XX_LDO_EN,
1087 .enable_time = BD71837_LDO3_STARTUP_TIME,
1088 .owner = THIS_MODULE,
1091 .reg = BD718XX_REG_LDO3_VOLT,
1092 .mask = BD718XX_LDO_SEL,
1093 .val = BD718XX_LDO_SEL,
1099 .of_match = of_match_ptr("LDO4"),
1100 .regulators_node = of_match_ptr("regulators"),
1102 .ops = &bd718xx_ldo_regulator_ops,
1103 .type = REGULATOR_VOLTAGE,
1104 .n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
1105 .linear_ranges = bd718xx_ldo4_volts,
1106 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
1107 .vsel_reg = BD718XX_REG_LDO4_VOLT,
1108 .vsel_mask = BD718XX_LDO4_MASK,
1109 .enable_reg = BD718XX_REG_LDO4_VOLT,
1110 .enable_mask = BD718XX_LDO_EN,
1111 .enable_time = BD71837_LDO4_STARTUP_TIME,
1112 .owner = THIS_MODULE,
1115 .reg = BD718XX_REG_LDO4_VOLT,
1116 .mask = BD718XX_LDO_SEL,
1117 .val = BD718XX_LDO_SEL,
1123 .of_match = of_match_ptr("LDO5"),
1124 .regulators_node = of_match_ptr("regulators"),
1126 .ops = &bd718xx_ldo_regulator_ops,
1127 .type = REGULATOR_VOLTAGE,
1128 .n_voltages = BD71837_LDO5_VOLTAGE_NUM,
1129 .linear_ranges = bd71837_ldo5_volts,
1130 .n_linear_ranges = ARRAY_SIZE(bd71837_ldo5_volts),
1131 /* LDO5 is supplied by buck6 */
1132 .supply_name = "buck6",
1133 .vsel_reg = BD718XX_REG_LDO5_VOLT,
1134 .vsel_mask = BD71837_LDO5_MASK,
1135 .enable_reg = BD718XX_REG_LDO5_VOLT,
1136 .enable_mask = BD718XX_LDO_EN,
1137 .enable_time = BD71837_LDO5_STARTUP_TIME,
1138 .owner = THIS_MODULE,
1141 .reg = BD718XX_REG_LDO5_VOLT,
1142 .mask = BD718XX_LDO_SEL,
1143 .val = BD718XX_LDO_SEL,
1145 .additional_inits = bd71837_ldo5_inits,
1146 .additional_init_amnt = ARRAY_SIZE(bd71837_ldo5_inits),
1151 .of_match = of_match_ptr("LDO6"),
1152 .regulators_node = of_match_ptr("regulators"),
1154 .ops = &bd718xx_ldo_regulator_ops,
1155 .type = REGULATOR_VOLTAGE,
1156 .n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
1157 .linear_ranges = bd718xx_ldo6_volts,
1158 .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
1159 /* LDO6 is supplied by buck7 */
1160 .supply_name = "buck7",
1161 .vsel_reg = BD718XX_REG_LDO6_VOLT,
1162 .vsel_mask = BD718XX_LDO6_MASK,
1163 .enable_reg = BD718XX_REG_LDO6_VOLT,
1164 .enable_mask = BD718XX_LDO_EN,
1165 .enable_time = BD71837_LDO6_STARTUP_TIME,
1166 .owner = THIS_MODULE,
1169 .reg = BD718XX_REG_LDO6_VOLT,
1170 .mask = BD718XX_LDO_SEL,
1171 .val = BD718XX_LDO_SEL,
1173 .additional_inits = bd71837_ldo6_inits,
1174 .additional_init_amnt = ARRAY_SIZE(bd71837_ldo6_inits),
1179 .of_match = of_match_ptr("LDO7"),
1180 .regulators_node = of_match_ptr("regulators"),
1182 .ops = &bd718xx_ldo_regulator_ops,
1183 .type = REGULATOR_VOLTAGE,
1184 .n_voltages = BD71837_LDO7_VOLTAGE_NUM,
1185 .linear_ranges = bd71837_ldo7_volts,
1186 .n_linear_ranges = ARRAY_SIZE(bd71837_ldo7_volts),
1187 .vsel_reg = BD71837_REG_LDO7_VOLT,
1188 .vsel_mask = BD71837_LDO7_MASK,
1189 .enable_reg = BD71837_REG_LDO7_VOLT,
1190 .enable_mask = BD718XX_LDO_EN,
1191 .enable_time = BD71837_LDO7_STARTUP_TIME,
1192 .owner = THIS_MODULE,
1195 .reg = BD71837_REG_LDO7_VOLT,
1196 .mask = BD718XX_LDO_SEL,
1197 .val = BD718XX_LDO_SEL,
1202 struct bd718xx_pmic_inits {
1203 const struct bd718xx_regulator_data *r_datas;
1204 unsigned int r_amount;
1207 static int bd718xx_probe(struct platform_device *pdev)
1209 struct bd718xx *mfd;
1210 struct regulator_config config = { 0 };
1211 struct bd718xx_pmic_inits pmic_regulators[ROHM_CHIP_TYPE_AMOUNT] = {
1212 [ROHM_CHIP_TYPE_BD71837] = {
1213 .r_datas = bd71837_regulators,
1214 .r_amount = ARRAY_SIZE(bd71837_regulators),
1216 [ROHM_CHIP_TYPE_BD71847] = {
1217 .r_datas = bd71847_regulators,
1218 .r_amount = ARRAY_SIZE(bd71847_regulators),
1225 mfd = dev_get_drvdata(pdev->dev.parent);
1227 dev_err(&pdev->dev, "No MFD driver data\n");
1232 if (mfd->chip.chip_type >= ROHM_CHIP_TYPE_AMOUNT ||
1233 !pmic_regulators[mfd->chip.chip_type].r_datas) {
1234 dev_err(&pdev->dev, "Unsupported chip type\n");
1239 /* Register LOCK release */
1240 err = regmap_update_bits(mfd->chip.regmap, BD718XX_REG_REGLOCK,
1241 (REGLOCK_PWRSEQ | REGLOCK_VREG), 0);
1243 dev_err(&pdev->dev, "Failed to unlock PMIC (%d)\n", err);
1246 dev_dbg(&pdev->dev, "Unlocked lock register 0x%x\n",
1247 BD718XX_REG_REGLOCK);
1250 use_snvs = of_property_read_bool(pdev->dev.parent->of_node,
1251 "rohm,reset-snvs-powered");
1254 * Change the next stage from poweroff to be READY instead of SNVS
1255 * for all reset types because OTP loading at READY will clear SEL
1256 * bit allowing HW defaults for power rails to be used
1259 err = regmap_update_bits(mfd->chip.regmap,
1260 BD718XX_REG_TRANS_COND1,
1261 BD718XX_ON_REQ_POWEROFF_MASK |
1262 BD718XX_SWRESET_POWEROFF_MASK |
1263 BD718XX_WDOG_POWEROFF_MASK |
1264 BD718XX_KEY_L_POWEROFF_MASK,
1265 BD718XX_POWOFF_TO_RDY);
1267 dev_err(&pdev->dev, "Failed to change reset target\n");
1271 "Changed all resets from SVNS to READY\n");
1275 for (i = 0; i < pmic_regulators[mfd->chip.chip_type].r_amount; i++) {
1277 const struct regulator_desc *desc;
1278 struct regulator_dev *rdev;
1279 const struct bd718xx_regulator_data *r;
1281 r = &pmic_regulators[mfd->chip.chip_type].r_datas[i];
1284 config.dev = pdev->dev.parent;
1285 config.regmap = mfd->chip.regmap;
1287 rdev = devm_regulator_register(&pdev->dev, desc, &config);
1290 "failed to register %s regulator\n",
1292 err = PTR_ERR(rdev);
1297 * Regulator register gets the regulator constraints and
1298 * applies them (set_machine_constraints). This should have
1299 * turned the control register(s) to correct values and we
1300 * can now switch the control from PMIC state machine to the
1301 * register interface
1303 * At poweroff transition PMIC HW disables EN bit for
1304 * regulators but leaves SEL bit untouched. So if state
1305 * transition from POWEROFF is done to SNVS - then all power
1306 * rails controlled by SW (having SEL bit set) stay disabled
1307 * as EN is cleared. This will result boot failure if any
1308 * crucial systems are powered by these rails. We don't
1309 * enable SW control for crucial regulators if snvs state is
1312 if (!use_snvs || !rdev->constraints->always_on ||
1313 !rdev->constraints->boot_on) {
1314 err = regmap_update_bits(mfd->chip.regmap, r->init.reg,
1315 r->init.mask, r->init.val);
1318 "Failed to take control for (%s)\n",
1323 for (j = 0; j < r->additional_init_amnt; j++) {
1324 err = regmap_update_bits(mfd->chip.regmap,
1325 r->additional_inits[j].reg,
1326 r->additional_inits[j].mask,
1327 r->additional_inits[j].val);
1330 "Buck (%s) initialization failed\n",
1341 static struct platform_driver bd718xx_regulator = {
1343 .name = "bd718xx-pmic",
1345 .probe = bd718xx_probe,
1348 module_platform_driver(bd718xx_regulator);
1350 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1351 MODULE_DESCRIPTION("BD71837/BD71847 voltage regulator driver");
1352 MODULE_LICENSE("GPL");