1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (C) 2019 ROHM Semiconductors
3 // bd71828-regulator.c ROHM BD71828GW-DS1 regulator driver
6 #include <linux/delay.h>
8 #include <linux/gpio.h>
9 #include <linux/interrupt.h>
10 #include <linux/kernel.h>
11 #include <linux/mfd/rohm-bd71828.h>
12 #include <linux/module.h>
14 #include <linux/platform_device.h>
15 #include <linux/regmap.h>
16 #include <linux/regulator/driver.h>
17 #include <linux/regulator/machine.h>
18 #include <linux/regulator/of_regulator.h>
25 struct bd71828_regulator_data
{
26 struct regulator_desc desc
;
27 const struct rohm_dvs_config dvs
;
28 const struct reg_init
*reg_inits
;
32 static const struct reg_init buck1_inits
[] = {
34 * DVS Buck voltages can be changed by register values or via GPIO.
35 * Use register accesses by default.
38 .reg
= BD71828_REG_PS_CTRL_1
,
39 .mask
= BD71828_MASK_DVS_BUCK1_CTRL
,
40 .val
= BD71828_DVS_BUCK1_CTRL_I2C
,
44 static const struct reg_init buck2_inits
[] = {
46 .reg
= BD71828_REG_PS_CTRL_1
,
47 .mask
= BD71828_MASK_DVS_BUCK2_CTRL
,
48 .val
= BD71828_DVS_BUCK2_CTRL_I2C
,
52 static const struct reg_init buck6_inits
[] = {
54 .reg
= BD71828_REG_PS_CTRL_1
,
55 .mask
= BD71828_MASK_DVS_BUCK6_CTRL
,
56 .val
= BD71828_DVS_BUCK6_CTRL_I2C
,
60 static const struct reg_init buck7_inits
[] = {
62 .reg
= BD71828_REG_PS_CTRL_1
,
63 .mask
= BD71828_MASK_DVS_BUCK7_CTRL
,
64 .val
= BD71828_DVS_BUCK7_CTRL_I2C
,
68 static const struct linear_range bd71828_buck1267_volts
[] = {
69 REGULATOR_LINEAR_RANGE(500000, 0x00, 0xef, 6250),
70 REGULATOR_LINEAR_RANGE(2000000, 0xf0, 0xff, 0),
73 static const struct linear_range bd71828_buck3_volts
[] = {
74 REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x0f, 50000),
75 REGULATOR_LINEAR_RANGE(2000000, 0x10, 0x1f, 0),
78 static const struct linear_range bd71828_buck4_volts
[] = {
79 REGULATOR_LINEAR_RANGE(1000000, 0x00, 0x1f, 25000),
80 REGULATOR_LINEAR_RANGE(1800000, 0x20, 0x3f, 0),
83 static const struct linear_range bd71828_buck5_volts
[] = {
84 REGULATOR_LINEAR_RANGE(2500000, 0x00, 0x0f, 50000),
85 REGULATOR_LINEAR_RANGE(3300000, 0x10, 0x1f, 0),
88 static const struct linear_range bd71828_ldo_volts
[] = {
89 REGULATOR_LINEAR_RANGE(800000, 0x00, 0x31, 50000),
90 REGULATOR_LINEAR_RANGE(3300000, 0x32, 0x3f, 0),
93 static int bd71828_set_ramp_delay(struct regulator_dev
*rdev
, int ramp_delay
)
107 case 10001 ... 20000:
113 "ramp_delay: %d not supported, setting 20mV/uS",
118 * On BD71828 the ramp delay level control reg is at offset +2 to
121 return regmap_update_bits(rdev
->regmap
, rdev
->desc
->enable_reg
+ 2,
122 BD71828_MASK_RAMP_DELAY
,
123 val
<< (ffs(BD71828_MASK_RAMP_DELAY
) - 1));
126 static int buck_set_hw_dvs_levels(struct device_node
*np
,
127 const struct regulator_desc
*desc
,
128 struct regulator_config
*cfg
)
130 struct bd71828_regulator_data
*data
;
132 data
= container_of(desc
, struct bd71828_regulator_data
, desc
);
134 return rohm_regulator_set_dvs_levels(&data
->dvs
, np
, desc
, cfg
->regmap
);
137 static int ldo6_parse_dt(struct device_node
*np
,
138 const struct regulator_desc
*desc
,
139 struct regulator_config
*cfg
)
144 struct regmap
*regmap
= cfg
->regmap
;
145 static const char * const props
[] = { "rohm,dvs-run-voltage",
146 "rohm,dvs-idle-voltage",
147 "rohm,dvs-suspend-voltage",
148 "rohm,dvs-lpsr-voltage" };
149 unsigned int mask
[] = { BD71828_MASK_RUN_EN
, BD71828_MASK_IDLE_EN
,
150 BD71828_MASK_SUSP_EN
, BD71828_MASK_LPSR_EN
};
152 for (i
= 0; i
< ARRAY_SIZE(props
); i
++) {
153 ret
= of_property_read_u32(np
, props
[i
], &uv
);
164 ret
= regmap_update_bits(regmap
, desc
->enable_reg
, mask
[i
], en
);
171 static const struct regulator_ops bd71828_buck_ops
= {
172 .enable
= regulator_enable_regmap
,
173 .disable
= regulator_disable_regmap
,
174 .is_enabled
= regulator_is_enabled_regmap
,
175 .list_voltage
= regulator_list_voltage_linear_range
,
176 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
177 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
180 static const struct regulator_ops bd71828_dvs_buck_ops
= {
181 .enable
= regulator_enable_regmap
,
182 .disable
= regulator_disable_regmap
,
183 .is_enabled
= regulator_is_enabled_regmap
,
184 .list_voltage
= regulator_list_voltage_linear_range
,
185 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
186 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
187 .set_voltage_time_sel
= regulator_set_voltage_time_sel
,
188 .set_ramp_delay
= bd71828_set_ramp_delay
,
191 static const struct regulator_ops bd71828_ldo_ops
= {
192 .enable
= regulator_enable_regmap
,
193 .disable
= regulator_disable_regmap
,
194 .is_enabled
= regulator_is_enabled_regmap
,
195 .list_voltage
= regulator_list_voltage_linear_range
,
196 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
197 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
200 static const struct regulator_ops bd71828_ldo6_ops
= {
201 .enable
= regulator_enable_regmap
,
202 .disable
= regulator_disable_regmap
,
203 .is_enabled
= regulator_is_enabled_regmap
,
206 static const struct bd71828_regulator_data bd71828_rdata
[] = {
210 .of_match
= of_match_ptr("BUCK1"),
211 .regulators_node
= of_match_ptr("regulators"),
213 .ops
= &bd71828_dvs_buck_ops
,
214 .type
= REGULATOR_VOLTAGE
,
215 .linear_ranges
= bd71828_buck1267_volts
,
216 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
217 .n_voltages
= BD71828_BUCK1267_VOLTS
,
218 .enable_reg
= BD71828_REG_BUCK1_EN
,
219 .enable_mask
= BD71828_MASK_RUN_EN
,
220 .vsel_reg
= BD71828_REG_BUCK1_VOLT
,
221 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
222 .owner
= THIS_MODULE
,
223 .of_parse_cb
= buck_set_hw_dvs_levels
,
226 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
227 ROHM_DVS_LEVEL_SUSPEND
|
229 .run_reg
= BD71828_REG_BUCK1_VOLT
,
230 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
231 .idle_reg
= BD71828_REG_BUCK1_IDLE_VOLT
,
232 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
233 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
234 .suspend_reg
= BD71828_REG_BUCK1_SUSP_VOLT
,
235 .suspend_mask
= BD71828_MASK_BUCK1267_VOLT
,
236 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
237 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
239 * LPSR voltage is same as SUSPEND voltage. Allow
240 * setting it so that regulator can be set enabled at
243 .lpsr_reg
= BD71828_REG_BUCK1_SUSP_VOLT
,
244 .lpsr_mask
= BD71828_MASK_BUCK1267_VOLT
,
246 .reg_inits
= buck1_inits
,
247 .reg_init_amnt
= ARRAY_SIZE(buck1_inits
),
252 .of_match
= of_match_ptr("BUCK2"),
253 .regulators_node
= of_match_ptr("regulators"),
255 .ops
= &bd71828_dvs_buck_ops
,
256 .type
= REGULATOR_VOLTAGE
,
257 .linear_ranges
= bd71828_buck1267_volts
,
258 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
259 .n_voltages
= BD71828_BUCK1267_VOLTS
,
260 .enable_reg
= BD71828_REG_BUCK2_EN
,
261 .enable_mask
= BD71828_MASK_RUN_EN
,
262 .vsel_reg
= BD71828_REG_BUCK2_VOLT
,
263 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
264 .owner
= THIS_MODULE
,
265 .of_parse_cb
= buck_set_hw_dvs_levels
,
268 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
269 ROHM_DVS_LEVEL_SUSPEND
|
271 .run_reg
= BD71828_REG_BUCK2_VOLT
,
272 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
273 .idle_reg
= BD71828_REG_BUCK2_IDLE_VOLT
,
274 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
275 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
276 .suspend_reg
= BD71828_REG_BUCK2_SUSP_VOLT
,
277 .suspend_mask
= BD71828_MASK_BUCK1267_VOLT
,
278 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
279 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
280 .lpsr_reg
= BD71828_REG_BUCK2_SUSP_VOLT
,
281 .lpsr_mask
= BD71828_MASK_BUCK1267_VOLT
,
283 .reg_inits
= buck2_inits
,
284 .reg_init_amnt
= ARRAY_SIZE(buck2_inits
),
289 .of_match
= of_match_ptr("BUCK3"),
290 .regulators_node
= of_match_ptr("regulators"),
292 .ops
= &bd71828_buck_ops
,
293 .type
= REGULATOR_VOLTAGE
,
294 .linear_ranges
= bd71828_buck3_volts
,
295 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck3_volts
),
296 .n_voltages
= BD71828_BUCK3_VOLTS
,
297 .enable_reg
= BD71828_REG_BUCK3_EN
,
298 .enable_mask
= BD71828_MASK_RUN_EN
,
299 .vsel_reg
= BD71828_REG_BUCK3_VOLT
,
300 .vsel_mask
= BD71828_MASK_BUCK3_VOLT
,
301 .owner
= THIS_MODULE
,
302 .of_parse_cb
= buck_set_hw_dvs_levels
,
306 * BUCK3 only supports single voltage for all states.
307 * voltage can be individually enabled for each state
308 * though => allow setting all states to support
309 * enabling power rail on different states.
311 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
312 ROHM_DVS_LEVEL_SUSPEND
|
314 .run_reg
= BD71828_REG_BUCK3_VOLT
,
315 .idle_reg
= BD71828_REG_BUCK3_VOLT
,
316 .suspend_reg
= BD71828_REG_BUCK3_VOLT
,
317 .lpsr_reg
= BD71828_REG_BUCK3_VOLT
,
318 .run_mask
= BD71828_MASK_BUCK3_VOLT
,
319 .idle_mask
= BD71828_MASK_BUCK3_VOLT
,
320 .suspend_mask
= BD71828_MASK_BUCK3_VOLT
,
321 .lpsr_mask
= BD71828_MASK_BUCK3_VOLT
,
322 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
323 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
324 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
330 .of_match
= of_match_ptr("BUCK4"),
331 .regulators_node
= of_match_ptr("regulators"),
333 .ops
= &bd71828_buck_ops
,
334 .type
= REGULATOR_VOLTAGE
,
335 .linear_ranges
= bd71828_buck4_volts
,
336 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck4_volts
),
337 .n_voltages
= BD71828_BUCK4_VOLTS
,
338 .enable_reg
= BD71828_REG_BUCK4_EN
,
339 .enable_mask
= BD71828_MASK_RUN_EN
,
340 .vsel_reg
= BD71828_REG_BUCK4_VOLT
,
341 .vsel_mask
= BD71828_MASK_BUCK4_VOLT
,
342 .owner
= THIS_MODULE
,
343 .of_parse_cb
= buck_set_hw_dvs_levels
,
347 * BUCK4 only supports single voltage for all states.
348 * voltage can be individually enabled for each state
349 * though => allow setting all states to support
350 * enabling power rail on different states.
352 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
353 ROHM_DVS_LEVEL_SUSPEND
|
355 .run_reg
= BD71828_REG_BUCK4_VOLT
,
356 .idle_reg
= BD71828_REG_BUCK4_VOLT
,
357 .suspend_reg
= BD71828_REG_BUCK4_VOLT
,
358 .lpsr_reg
= BD71828_REG_BUCK4_VOLT
,
359 .run_mask
= BD71828_MASK_BUCK4_VOLT
,
360 .idle_mask
= BD71828_MASK_BUCK4_VOLT
,
361 .suspend_mask
= BD71828_MASK_BUCK4_VOLT
,
362 .lpsr_mask
= BD71828_MASK_BUCK4_VOLT
,
363 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
364 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
365 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
371 .of_match
= of_match_ptr("BUCK5"),
372 .regulators_node
= of_match_ptr("regulators"),
374 .ops
= &bd71828_buck_ops
,
375 .type
= REGULATOR_VOLTAGE
,
376 .linear_ranges
= bd71828_buck5_volts
,
377 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck5_volts
),
378 .n_voltages
= BD71828_BUCK5_VOLTS
,
379 .enable_reg
= BD71828_REG_BUCK5_EN
,
380 .enable_mask
= BD71828_MASK_RUN_EN
,
381 .vsel_reg
= BD71828_REG_BUCK5_VOLT
,
382 .vsel_mask
= BD71828_MASK_BUCK5_VOLT
,
383 .owner
= THIS_MODULE
,
384 .of_parse_cb
= buck_set_hw_dvs_levels
,
388 * BUCK5 only supports single voltage for all states.
389 * voltage can be individually enabled for each state
390 * though => allow setting all states to support
391 * enabling power rail on different states.
393 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
394 ROHM_DVS_LEVEL_SUSPEND
|
396 .run_reg
= BD71828_REG_BUCK5_VOLT
,
397 .idle_reg
= BD71828_REG_BUCK5_VOLT
,
398 .suspend_reg
= BD71828_REG_BUCK5_VOLT
,
399 .lpsr_reg
= BD71828_REG_BUCK5_VOLT
,
400 .run_mask
= BD71828_MASK_BUCK5_VOLT
,
401 .idle_mask
= BD71828_MASK_BUCK5_VOLT
,
402 .suspend_mask
= BD71828_MASK_BUCK5_VOLT
,
403 .lpsr_mask
= BD71828_MASK_BUCK5_VOLT
,
404 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
405 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
406 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
412 .of_match
= of_match_ptr("BUCK6"),
413 .regulators_node
= of_match_ptr("regulators"),
415 .ops
= &bd71828_dvs_buck_ops
,
416 .type
= REGULATOR_VOLTAGE
,
417 .linear_ranges
= bd71828_buck1267_volts
,
418 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
419 .n_voltages
= BD71828_BUCK1267_VOLTS
,
420 .enable_reg
= BD71828_REG_BUCK6_EN
,
421 .enable_mask
= BD71828_MASK_RUN_EN
,
422 .vsel_reg
= BD71828_REG_BUCK6_VOLT
,
423 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
424 .owner
= THIS_MODULE
,
425 .of_parse_cb
= buck_set_hw_dvs_levels
,
428 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
429 ROHM_DVS_LEVEL_SUSPEND
|
431 .run_reg
= BD71828_REG_BUCK6_VOLT
,
432 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
433 .idle_reg
= BD71828_REG_BUCK6_IDLE_VOLT
,
434 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
435 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
436 .suspend_reg
= BD71828_REG_BUCK6_SUSP_VOLT
,
437 .suspend_mask
= BD71828_MASK_BUCK1267_VOLT
,
438 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
439 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
440 .lpsr_reg
= BD71828_REG_BUCK6_SUSP_VOLT
,
441 .lpsr_mask
= BD71828_MASK_BUCK1267_VOLT
,
443 .reg_inits
= buck6_inits
,
444 .reg_init_amnt
= ARRAY_SIZE(buck6_inits
),
449 .of_match
= of_match_ptr("BUCK7"),
450 .regulators_node
= of_match_ptr("regulators"),
452 .ops
= &bd71828_dvs_buck_ops
,
453 .type
= REGULATOR_VOLTAGE
,
454 .linear_ranges
= bd71828_buck1267_volts
,
455 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
456 .n_voltages
= BD71828_BUCK1267_VOLTS
,
457 .enable_reg
= BD71828_REG_BUCK7_EN
,
458 .enable_mask
= BD71828_MASK_RUN_EN
,
459 .vsel_reg
= BD71828_REG_BUCK7_VOLT
,
460 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
461 .owner
= THIS_MODULE
,
462 .of_parse_cb
= buck_set_hw_dvs_levels
,
465 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
466 ROHM_DVS_LEVEL_SUSPEND
|
468 .run_reg
= BD71828_REG_BUCK7_VOLT
,
469 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
470 .idle_reg
= BD71828_REG_BUCK7_IDLE_VOLT
,
471 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
472 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
473 .suspend_reg
= BD71828_REG_BUCK7_SUSP_VOLT
,
474 .suspend_mask
= BD71828_MASK_BUCK1267_VOLT
,
475 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
476 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
477 .lpsr_reg
= BD71828_REG_BUCK7_SUSP_VOLT
,
478 .lpsr_mask
= BD71828_MASK_BUCK1267_VOLT
,
480 .reg_inits
= buck7_inits
,
481 .reg_init_amnt
= ARRAY_SIZE(buck7_inits
),
486 .of_match
= of_match_ptr("LDO1"),
487 .regulators_node
= of_match_ptr("regulators"),
489 .ops
= &bd71828_ldo_ops
,
490 .type
= REGULATOR_VOLTAGE
,
491 .linear_ranges
= bd71828_ldo_volts
,
492 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
493 .n_voltages
= BD71828_LDO_VOLTS
,
494 .enable_reg
= BD71828_REG_LDO1_EN
,
495 .enable_mask
= BD71828_MASK_RUN_EN
,
496 .vsel_reg
= BD71828_REG_LDO1_VOLT
,
497 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
498 .owner
= THIS_MODULE
,
499 .of_parse_cb
= buck_set_hw_dvs_levels
,
503 * LDO1 only supports single voltage for all states.
504 * voltage can be individually enabled for each state
505 * though => allow setting all states to support
506 * enabling power rail on different states.
508 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
509 ROHM_DVS_LEVEL_SUSPEND
|
511 .run_reg
= BD71828_REG_LDO1_VOLT
,
512 .idle_reg
= BD71828_REG_LDO1_VOLT
,
513 .suspend_reg
= BD71828_REG_LDO1_VOLT
,
514 .lpsr_reg
= BD71828_REG_LDO1_VOLT
,
515 .run_mask
= BD71828_MASK_LDO_VOLT
,
516 .idle_mask
= BD71828_MASK_LDO_VOLT
,
517 .suspend_mask
= BD71828_MASK_LDO_VOLT
,
518 .lpsr_mask
= BD71828_MASK_LDO_VOLT
,
519 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
520 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
521 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
526 .of_match
= of_match_ptr("LDO2"),
527 .regulators_node
= of_match_ptr("regulators"),
529 .ops
= &bd71828_ldo_ops
,
530 .type
= REGULATOR_VOLTAGE
,
531 .linear_ranges
= bd71828_ldo_volts
,
532 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
533 .n_voltages
= BD71828_LDO_VOLTS
,
534 .enable_reg
= BD71828_REG_LDO2_EN
,
535 .enable_mask
= BD71828_MASK_RUN_EN
,
536 .vsel_reg
= BD71828_REG_LDO2_VOLT
,
537 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
538 .owner
= THIS_MODULE
,
539 .of_parse_cb
= buck_set_hw_dvs_levels
,
543 * LDO2 only supports single voltage for all states.
544 * voltage can be individually enabled for each state
545 * though => allow setting all states to support
546 * enabling power rail on different states.
548 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
549 ROHM_DVS_LEVEL_SUSPEND
|
551 .run_reg
= BD71828_REG_LDO2_VOLT
,
552 .idle_reg
= BD71828_REG_LDO2_VOLT
,
553 .suspend_reg
= BD71828_REG_LDO2_VOLT
,
554 .lpsr_reg
= BD71828_REG_LDO2_VOLT
,
555 .run_mask
= BD71828_MASK_LDO_VOLT
,
556 .idle_mask
= BD71828_MASK_LDO_VOLT
,
557 .suspend_mask
= BD71828_MASK_LDO_VOLT
,
558 .lpsr_mask
= BD71828_MASK_LDO_VOLT
,
559 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
560 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
561 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
566 .of_match
= of_match_ptr("LDO3"),
567 .regulators_node
= of_match_ptr("regulators"),
569 .ops
= &bd71828_ldo_ops
,
570 .type
= REGULATOR_VOLTAGE
,
571 .linear_ranges
= bd71828_ldo_volts
,
572 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
573 .n_voltages
= BD71828_LDO_VOLTS
,
574 .enable_reg
= BD71828_REG_LDO3_EN
,
575 .enable_mask
= BD71828_MASK_RUN_EN
,
576 .vsel_reg
= BD71828_REG_LDO3_VOLT
,
577 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
578 .owner
= THIS_MODULE
,
579 .of_parse_cb
= buck_set_hw_dvs_levels
,
583 * LDO3 only supports single voltage for all states.
584 * voltage can be individually enabled for each state
585 * though => allow setting all states to support
586 * enabling power rail on different states.
588 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
589 ROHM_DVS_LEVEL_SUSPEND
|
591 .run_reg
= BD71828_REG_LDO3_VOLT
,
592 .idle_reg
= BD71828_REG_LDO3_VOLT
,
593 .suspend_reg
= BD71828_REG_LDO3_VOLT
,
594 .lpsr_reg
= BD71828_REG_LDO3_VOLT
,
595 .run_mask
= BD71828_MASK_LDO_VOLT
,
596 .idle_mask
= BD71828_MASK_LDO_VOLT
,
597 .suspend_mask
= BD71828_MASK_LDO_VOLT
,
598 .lpsr_mask
= BD71828_MASK_LDO_VOLT
,
599 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
600 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
601 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
607 .of_match
= of_match_ptr("LDO4"),
608 .regulators_node
= of_match_ptr("regulators"),
610 .ops
= &bd71828_ldo_ops
,
611 .type
= REGULATOR_VOLTAGE
,
612 .linear_ranges
= bd71828_ldo_volts
,
613 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
614 .n_voltages
= BD71828_LDO_VOLTS
,
615 .enable_reg
= BD71828_REG_LDO4_EN
,
616 .enable_mask
= BD71828_MASK_RUN_EN
,
617 .vsel_reg
= BD71828_REG_LDO4_VOLT
,
618 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
619 .owner
= THIS_MODULE
,
620 .of_parse_cb
= buck_set_hw_dvs_levels
,
624 * LDO1 only supports single voltage for all states.
625 * voltage can be individually enabled for each state
626 * though => allow setting all states to support
627 * enabling power rail on different states.
629 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
630 ROHM_DVS_LEVEL_SUSPEND
|
632 .run_reg
= BD71828_REG_LDO4_VOLT
,
633 .idle_reg
= BD71828_REG_LDO4_VOLT
,
634 .suspend_reg
= BD71828_REG_LDO4_VOLT
,
635 .lpsr_reg
= BD71828_REG_LDO4_VOLT
,
636 .run_mask
= BD71828_MASK_LDO_VOLT
,
637 .idle_mask
= BD71828_MASK_LDO_VOLT
,
638 .suspend_mask
= BD71828_MASK_LDO_VOLT
,
639 .lpsr_mask
= BD71828_MASK_LDO_VOLT
,
640 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
641 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
642 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
647 .of_match
= of_match_ptr("LDO5"),
648 .regulators_node
= of_match_ptr("regulators"),
650 .ops
= &bd71828_ldo_ops
,
651 .type
= REGULATOR_VOLTAGE
,
652 .linear_ranges
= bd71828_ldo_volts
,
653 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
654 .n_voltages
= BD71828_LDO_VOLTS
,
655 .enable_reg
= BD71828_REG_LDO5_EN
,
656 .enable_mask
= BD71828_MASK_RUN_EN
,
657 .vsel_reg
= BD71828_REG_LDO5_VOLT
,
658 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
659 .of_parse_cb
= buck_set_hw_dvs_levels
,
660 .owner
= THIS_MODULE
,
663 * LDO5 is special. It can choose vsel settings to be configured
664 * from 2 different registers (by GPIO).
666 * This driver supports only configuration where
667 * BD71828_REG_LDO5_VOLT_L is used.
670 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
671 ROHM_DVS_LEVEL_SUSPEND
|
673 .run_reg
= BD71828_REG_LDO5_VOLT
,
674 .idle_reg
= BD71828_REG_LDO5_VOLT
,
675 .suspend_reg
= BD71828_REG_LDO5_VOLT
,
676 .lpsr_reg
= BD71828_REG_LDO5_VOLT
,
677 .run_mask
= BD71828_MASK_LDO_VOLT
,
678 .idle_mask
= BD71828_MASK_LDO_VOLT
,
679 .suspend_mask
= BD71828_MASK_LDO_VOLT
,
680 .lpsr_mask
= BD71828_MASK_LDO_VOLT
,
681 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
682 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
683 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
689 .of_match
= of_match_ptr("LDO6"),
690 .regulators_node
= of_match_ptr("regulators"),
692 .ops
= &bd71828_ldo6_ops
,
693 .type
= REGULATOR_VOLTAGE
,
694 .fixed_uV
= BD71828_LDO_6_VOLTAGE
,
696 .enable_reg
= BD71828_REG_LDO6_EN
,
697 .enable_mask
= BD71828_MASK_RUN_EN
,
698 .owner
= THIS_MODULE
,
700 * LDO6 only supports enable/disable for all states.
701 * Voltage for LDO6 is fixed.
703 .of_parse_cb
= ldo6_parse_dt
,
707 /* SNVS LDO in data-sheet */
709 .of_match
= of_match_ptr("LDO7"),
710 .regulators_node
= of_match_ptr("regulators"),
711 .id
= BD71828_LDO_SNVS
,
712 .ops
= &bd71828_ldo_ops
,
713 .type
= REGULATOR_VOLTAGE
,
714 .linear_ranges
= bd71828_ldo_volts
,
715 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
716 .n_voltages
= BD71828_LDO_VOLTS
,
717 .enable_reg
= BD71828_REG_LDO7_EN
,
718 .enable_mask
= BD71828_MASK_RUN_EN
,
719 .vsel_reg
= BD71828_REG_LDO7_VOLT
,
720 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
721 .owner
= THIS_MODULE
,
722 .of_parse_cb
= buck_set_hw_dvs_levels
,
726 * LDO7 only supports single voltage for all states.
727 * voltage can be individually enabled for each state
728 * though => allow setting all states to support
729 * enabling power rail on different states.
731 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
732 ROHM_DVS_LEVEL_SUSPEND
|
734 .run_reg
= BD71828_REG_LDO7_VOLT
,
735 .idle_reg
= BD71828_REG_LDO7_VOLT
,
736 .suspend_reg
= BD71828_REG_LDO7_VOLT
,
737 .lpsr_reg
= BD71828_REG_LDO7_VOLT
,
738 .run_mask
= BD71828_MASK_LDO_VOLT
,
739 .idle_mask
= BD71828_MASK_LDO_VOLT
,
740 .suspend_mask
= BD71828_MASK_LDO_VOLT
,
741 .lpsr_mask
= BD71828_MASK_LDO_VOLT
,
742 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
743 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
744 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
750 static int bd71828_probe(struct platform_device
*pdev
)
752 struct rohm_regmap_dev
*bd71828
;
754 struct regulator_config config
= {
755 .dev
= pdev
->dev
.parent
,
758 bd71828
= dev_get_drvdata(pdev
->dev
.parent
);
760 dev_err(&pdev
->dev
, "No MFD driver data\n");
764 config
.regmap
= bd71828
->regmap
;
766 for (i
= 0; i
< ARRAY_SIZE(bd71828_rdata
); i
++) {
767 struct regulator_dev
*rdev
;
768 const struct bd71828_regulator_data
*rd
;
770 rd
= &bd71828_rdata
[i
];
771 rdev
= devm_regulator_register(&pdev
->dev
,
775 "failed to register %s regulator\n",
777 return PTR_ERR(rdev
);
779 for (j
= 0; j
< rd
->reg_init_amnt
; j
++) {
780 ret
= regmap_update_bits(bd71828
->regmap
,
781 rd
->reg_inits
[j
].reg
,
782 rd
->reg_inits
[j
].mask
,
783 rd
->reg_inits
[j
].val
);
786 "regulator %s init failed\n",
795 static struct platform_driver bd71828_regulator
= {
797 .name
= "bd71828-pmic"
799 .probe
= bd71828_probe
,
802 module_platform_driver(bd71828_regulator
);
804 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
805 MODULE_DESCRIPTION("BD71828 voltage regulator driver");
806 MODULE_LICENSE("GPL");
807 MODULE_ALIAS("platform:bd71828-pmic");