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/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/mfd/rohm-bd71828.h>
11 #include <linux/module.h>
13 #include <linux/platform_device.h>
14 #include <linux/regmap.h>
15 #include <linux/regulator/driver.h>
16 #include <linux/regulator/machine.h>
17 #include <linux/regulator/of_regulator.h>
24 struct bd71828_regulator_data
{
25 struct regulator_desc desc
;
26 const struct rohm_dvs_config dvs
;
27 const struct reg_init
*reg_inits
;
31 static const struct reg_init buck1_inits
[] = {
33 * DVS Buck voltages can be changed by register values or via GPIO.
34 * Use register accesses by default.
37 .reg
= BD71828_REG_PS_CTRL_1
,
38 .mask
= BD71828_MASK_DVS_BUCK1_CTRL
,
39 .val
= BD71828_DVS_BUCK1_CTRL_I2C
,
43 static const struct reg_init buck2_inits
[] = {
45 .reg
= BD71828_REG_PS_CTRL_1
,
46 .mask
= BD71828_MASK_DVS_BUCK2_CTRL
,
47 .val
= BD71828_DVS_BUCK2_CTRL_I2C
,
51 static const struct reg_init buck6_inits
[] = {
53 .reg
= BD71828_REG_PS_CTRL_1
,
54 .mask
= BD71828_MASK_DVS_BUCK6_CTRL
,
55 .val
= BD71828_DVS_BUCK6_CTRL_I2C
,
59 static const struct reg_init buck7_inits
[] = {
61 .reg
= BD71828_REG_PS_CTRL_1
,
62 .mask
= BD71828_MASK_DVS_BUCK7_CTRL
,
63 .val
= BD71828_DVS_BUCK7_CTRL_I2C
,
67 static const struct linear_range bd71828_buck1267_volts
[] = {
68 REGULATOR_LINEAR_RANGE(500000, 0x00, 0xef, 6250),
69 REGULATOR_LINEAR_RANGE(2000000, 0xf0, 0xff, 0),
72 static const struct linear_range bd71828_buck3_volts
[] = {
73 REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x0f, 50000),
74 REGULATOR_LINEAR_RANGE(2000000, 0x10, 0x1f, 0),
77 static const struct linear_range bd71828_buck4_volts
[] = {
78 REGULATOR_LINEAR_RANGE(1000000, 0x00, 0x1f, 25000),
79 REGULATOR_LINEAR_RANGE(1800000, 0x20, 0x3f, 0),
82 static const struct linear_range bd71828_buck5_volts
[] = {
83 REGULATOR_LINEAR_RANGE(2500000, 0x00, 0x0f, 50000),
84 REGULATOR_LINEAR_RANGE(3300000, 0x10, 0x1f, 0),
87 static const struct linear_range bd71828_ldo_volts
[] = {
88 REGULATOR_LINEAR_RANGE(800000, 0x00, 0x31, 50000),
89 REGULATOR_LINEAR_RANGE(3300000, 0x32, 0x3f, 0),
92 static const unsigned int bd71828_ramp_delay
[] = { 2500, 5000, 10000, 20000 };
94 static int buck_set_hw_dvs_levels(struct device_node
*np
,
95 const struct regulator_desc
*desc
,
96 struct regulator_config
*cfg
)
98 struct bd71828_regulator_data
*data
;
100 data
= container_of(desc
, struct bd71828_regulator_data
, desc
);
102 return rohm_regulator_set_dvs_levels(&data
->dvs
, np
, desc
, cfg
->regmap
);
105 static int ldo6_parse_dt(struct device_node
*np
,
106 const struct regulator_desc
*desc
,
107 struct regulator_config
*cfg
)
112 struct regmap
*regmap
= cfg
->regmap
;
113 static const char * const props
[] = { "rohm,dvs-run-voltage",
114 "rohm,dvs-idle-voltage",
115 "rohm,dvs-suspend-voltage",
116 "rohm,dvs-lpsr-voltage" };
117 unsigned int mask
[] = { BD71828_MASK_RUN_EN
, BD71828_MASK_IDLE_EN
,
118 BD71828_MASK_SUSP_EN
, BD71828_MASK_LPSR_EN
};
120 for (i
= 0; i
< ARRAY_SIZE(props
); i
++) {
121 ret
= of_property_read_u32(np
, props
[i
], &uv
);
132 ret
= regmap_update_bits(regmap
, desc
->enable_reg
, mask
[i
], en
);
139 static const struct regulator_ops bd71828_buck_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
,
148 static const struct regulator_ops bd71828_dvs_buck_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
= regulator_set_voltage_sel_regmap
,
154 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
155 .set_voltage_time_sel
= regulator_set_voltage_time_sel
,
156 .set_ramp_delay
= regulator_set_ramp_delay_regmap
,
159 static const struct regulator_ops bd71828_ldo_ops
= {
160 .enable
= regulator_enable_regmap
,
161 .disable
= regulator_disable_regmap
,
162 .is_enabled
= regulator_is_enabled_regmap
,
163 .list_voltage
= regulator_list_voltage_linear_range
,
164 .set_voltage_sel
= regulator_set_voltage_sel_regmap
,
165 .get_voltage_sel
= regulator_get_voltage_sel_regmap
,
168 static const struct regulator_ops bd71828_ldo6_ops
= {
169 .enable
= regulator_enable_regmap
,
170 .disable
= regulator_disable_regmap
,
171 .is_enabled
= regulator_is_enabled_regmap
,
174 static const struct bd71828_regulator_data bd71828_rdata
[] = {
178 .of_match
= of_match_ptr("BUCK1"),
179 .regulators_node
= of_match_ptr("regulators"),
181 .ops
= &bd71828_dvs_buck_ops
,
182 .type
= REGULATOR_VOLTAGE
,
183 .linear_ranges
= bd71828_buck1267_volts
,
184 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
185 .n_voltages
= BD71828_BUCK1267_VOLTS
,
186 .enable_reg
= BD71828_REG_BUCK1_EN
,
187 .enable_mask
= BD71828_MASK_RUN_EN
,
188 .vsel_reg
= BD71828_REG_BUCK1_VOLT
,
189 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
190 .ramp_delay_table
= bd71828_ramp_delay
,
191 .n_ramp_values
= ARRAY_SIZE(bd71828_ramp_delay
),
192 .ramp_reg
= BD71828_REG_BUCK1_MODE
,
193 .ramp_mask
= BD71828_MASK_RAMP_DELAY
,
194 .owner
= THIS_MODULE
,
195 .of_parse_cb
= buck_set_hw_dvs_levels
,
198 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
199 ROHM_DVS_LEVEL_SUSPEND
|
201 .run_reg
= BD71828_REG_BUCK1_VOLT
,
202 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
203 .idle_reg
= BD71828_REG_BUCK1_IDLE_VOLT
,
204 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
205 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
206 .suspend_reg
= BD71828_REG_BUCK1_SUSP_VOLT
,
207 .suspend_mask
= BD71828_MASK_BUCK1267_VOLT
,
208 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
210 * LPSR voltage is same as SUSPEND voltage. Allow
211 * only enabling/disabling regulator for LPSR state
213 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
215 .reg_inits
= buck1_inits
,
216 .reg_init_amnt
= ARRAY_SIZE(buck1_inits
),
221 .of_match
= of_match_ptr("BUCK2"),
222 .regulators_node
= of_match_ptr("regulators"),
224 .ops
= &bd71828_dvs_buck_ops
,
225 .type
= REGULATOR_VOLTAGE
,
226 .linear_ranges
= bd71828_buck1267_volts
,
227 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
228 .n_voltages
= BD71828_BUCK1267_VOLTS
,
229 .enable_reg
= BD71828_REG_BUCK2_EN
,
230 .enable_mask
= BD71828_MASK_RUN_EN
,
231 .vsel_reg
= BD71828_REG_BUCK2_VOLT
,
232 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
233 .ramp_delay_table
= bd71828_ramp_delay
,
234 .n_ramp_values
= ARRAY_SIZE(bd71828_ramp_delay
),
235 .ramp_reg
= BD71828_REG_BUCK2_MODE
,
236 .ramp_mask
= BD71828_MASK_RAMP_DELAY
,
237 .owner
= THIS_MODULE
,
238 .of_parse_cb
= buck_set_hw_dvs_levels
,
241 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
242 ROHM_DVS_LEVEL_SUSPEND
|
244 .run_reg
= BD71828_REG_BUCK2_VOLT
,
245 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
246 .idle_reg
= BD71828_REG_BUCK2_IDLE_VOLT
,
247 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
248 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
249 .suspend_reg
= BD71828_REG_BUCK2_SUSP_VOLT
,
250 .suspend_mask
= BD71828_MASK_BUCK1267_VOLT
,
251 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
252 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
253 .lpsr_reg
= BD71828_REG_BUCK2_SUSP_VOLT
,
254 .lpsr_mask
= BD71828_MASK_BUCK1267_VOLT
,
256 .reg_inits
= buck2_inits
,
257 .reg_init_amnt
= ARRAY_SIZE(buck2_inits
),
262 .of_match
= of_match_ptr("BUCK3"),
263 .regulators_node
= of_match_ptr("regulators"),
265 .ops
= &bd71828_buck_ops
,
266 .type
= REGULATOR_VOLTAGE
,
267 .linear_ranges
= bd71828_buck3_volts
,
268 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck3_volts
),
269 .n_voltages
= BD71828_BUCK3_VOLTS
,
270 .enable_reg
= BD71828_REG_BUCK3_EN
,
271 .enable_mask
= BD71828_MASK_RUN_EN
,
272 .vsel_reg
= BD71828_REG_BUCK3_VOLT
,
273 .vsel_mask
= BD71828_MASK_BUCK3_VOLT
,
274 .owner
= THIS_MODULE
,
275 .of_parse_cb
= buck_set_hw_dvs_levels
,
279 * BUCK3 only supports single voltage for all states.
280 * voltage can be individually enabled for each state
281 * though => allow setting all states to support
282 * enabling power rail on different states.
284 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
285 ROHM_DVS_LEVEL_SUSPEND
|
287 .run_reg
= BD71828_REG_BUCK3_VOLT
,
288 .run_mask
= BD71828_MASK_BUCK3_VOLT
,
289 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
290 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
291 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
297 .of_match
= of_match_ptr("BUCK4"),
298 .regulators_node
= of_match_ptr("regulators"),
300 .ops
= &bd71828_buck_ops
,
301 .type
= REGULATOR_VOLTAGE
,
302 .linear_ranges
= bd71828_buck4_volts
,
303 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck4_volts
),
304 .n_voltages
= BD71828_BUCK4_VOLTS
,
305 .enable_reg
= BD71828_REG_BUCK4_EN
,
306 .enable_mask
= BD71828_MASK_RUN_EN
,
307 .vsel_reg
= BD71828_REG_BUCK4_VOLT
,
308 .vsel_mask
= BD71828_MASK_BUCK4_VOLT
,
309 .owner
= THIS_MODULE
,
310 .of_parse_cb
= buck_set_hw_dvs_levels
,
314 * BUCK4 only supports single voltage for all states.
315 * voltage can be individually enabled for each state
316 * though => allow setting all states to support
317 * enabling power rail on different states.
319 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
320 ROHM_DVS_LEVEL_SUSPEND
|
322 .run_reg
= BD71828_REG_BUCK4_VOLT
,
323 .run_mask
= BD71828_MASK_BUCK4_VOLT
,
324 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
325 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
326 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
332 .of_match
= of_match_ptr("BUCK5"),
333 .regulators_node
= of_match_ptr("regulators"),
335 .ops
= &bd71828_buck_ops
,
336 .type
= REGULATOR_VOLTAGE
,
337 .linear_ranges
= bd71828_buck5_volts
,
338 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck5_volts
),
339 .n_voltages
= BD71828_BUCK5_VOLTS
,
340 .enable_reg
= BD71828_REG_BUCK5_EN
,
341 .enable_mask
= BD71828_MASK_RUN_EN
,
342 .vsel_reg
= BD71828_REG_BUCK5_VOLT
,
343 .vsel_mask
= BD71828_MASK_BUCK5_VOLT
,
344 .owner
= THIS_MODULE
,
345 .of_parse_cb
= buck_set_hw_dvs_levels
,
349 * BUCK5 only supports single voltage for all states.
350 * voltage can be individually enabled for each state
351 * though => allow setting all states to support
352 * enabling power rail on different states.
354 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
355 ROHM_DVS_LEVEL_SUSPEND
|
357 .run_reg
= BD71828_REG_BUCK5_VOLT
,
358 .run_mask
= BD71828_MASK_BUCK5_VOLT
,
359 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
360 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
361 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
367 .of_match
= of_match_ptr("BUCK6"),
368 .regulators_node
= of_match_ptr("regulators"),
370 .ops
= &bd71828_dvs_buck_ops
,
371 .type
= REGULATOR_VOLTAGE
,
372 .linear_ranges
= bd71828_buck1267_volts
,
373 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
374 .n_voltages
= BD71828_BUCK1267_VOLTS
,
375 .enable_reg
= BD71828_REG_BUCK6_EN
,
376 .enable_mask
= BD71828_MASK_RUN_EN
,
377 .vsel_reg
= BD71828_REG_BUCK6_VOLT
,
378 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
379 .ramp_delay_table
= bd71828_ramp_delay
,
380 .n_ramp_values
= ARRAY_SIZE(bd71828_ramp_delay
),
381 .ramp_reg
= BD71828_REG_BUCK6_MODE
,
382 .ramp_mask
= BD71828_MASK_RAMP_DELAY
,
383 .owner
= THIS_MODULE
,
384 .of_parse_cb
= buck_set_hw_dvs_levels
,
387 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
388 ROHM_DVS_LEVEL_SUSPEND
|
390 .run_reg
= BD71828_REG_BUCK6_VOLT
,
391 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
392 .idle_reg
= BD71828_REG_BUCK6_IDLE_VOLT
,
393 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
394 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
395 .suspend_reg
= BD71828_REG_BUCK6_SUSP_VOLT
,
396 .suspend_mask
= BD71828_MASK_BUCK1267_VOLT
,
397 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
398 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
399 .lpsr_reg
= BD71828_REG_BUCK6_SUSP_VOLT
,
400 .lpsr_mask
= BD71828_MASK_BUCK1267_VOLT
,
402 .reg_inits
= buck6_inits
,
403 .reg_init_amnt
= ARRAY_SIZE(buck6_inits
),
408 .of_match
= of_match_ptr("BUCK7"),
409 .regulators_node
= of_match_ptr("regulators"),
411 .ops
= &bd71828_dvs_buck_ops
,
412 .type
= REGULATOR_VOLTAGE
,
413 .linear_ranges
= bd71828_buck1267_volts
,
414 .n_linear_ranges
= ARRAY_SIZE(bd71828_buck1267_volts
),
415 .n_voltages
= BD71828_BUCK1267_VOLTS
,
416 .enable_reg
= BD71828_REG_BUCK7_EN
,
417 .enable_mask
= BD71828_MASK_RUN_EN
,
418 .vsel_reg
= BD71828_REG_BUCK7_VOLT
,
419 .vsel_mask
= BD71828_MASK_BUCK1267_VOLT
,
420 .ramp_delay_table
= bd71828_ramp_delay
,
421 .n_ramp_values
= ARRAY_SIZE(bd71828_ramp_delay
),
422 .ramp_reg
= BD71828_REG_BUCK7_MODE
,
423 .ramp_mask
= BD71828_MASK_RAMP_DELAY
,
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_BUCK7_VOLT
,
432 .run_mask
= BD71828_MASK_BUCK1267_VOLT
,
433 .idle_reg
= BD71828_REG_BUCK7_IDLE_VOLT
,
434 .idle_mask
= BD71828_MASK_BUCK1267_VOLT
,
435 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
436 .suspend_reg
= BD71828_REG_BUCK7_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_BUCK7_SUSP_VOLT
,
441 .lpsr_mask
= BD71828_MASK_BUCK1267_VOLT
,
443 .reg_inits
= buck7_inits
,
444 .reg_init_amnt
= ARRAY_SIZE(buck7_inits
),
449 .of_match
= of_match_ptr("LDO1"),
450 .regulators_node
= of_match_ptr("regulators"),
452 .ops
= &bd71828_ldo_ops
,
453 .type
= REGULATOR_VOLTAGE
,
454 .linear_ranges
= bd71828_ldo_volts
,
455 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
456 .n_voltages
= BD71828_LDO_VOLTS
,
457 .enable_reg
= BD71828_REG_LDO1_EN
,
458 .enable_mask
= BD71828_MASK_RUN_EN
,
459 .vsel_reg
= BD71828_REG_LDO1_VOLT
,
460 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
461 .owner
= THIS_MODULE
,
462 .of_parse_cb
= buck_set_hw_dvs_levels
,
466 * LDO1 only supports single voltage for all states.
467 * voltage can be individually enabled for each state
468 * though => allow setting all states to support
469 * enabling power rail on different states.
471 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
472 ROHM_DVS_LEVEL_SUSPEND
|
474 .run_reg
= BD71828_REG_LDO1_VOLT
,
475 .run_mask
= BD71828_MASK_LDO_VOLT
,
476 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
477 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
478 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
483 .of_match
= of_match_ptr("LDO2"),
484 .regulators_node
= of_match_ptr("regulators"),
486 .ops
= &bd71828_ldo_ops
,
487 .type
= REGULATOR_VOLTAGE
,
488 .linear_ranges
= bd71828_ldo_volts
,
489 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
490 .n_voltages
= BD71828_LDO_VOLTS
,
491 .enable_reg
= BD71828_REG_LDO2_EN
,
492 .enable_mask
= BD71828_MASK_RUN_EN
,
493 .vsel_reg
= BD71828_REG_LDO2_VOLT
,
494 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
495 .owner
= THIS_MODULE
,
496 .of_parse_cb
= buck_set_hw_dvs_levels
,
500 * LDO2 only supports single voltage for all states.
501 * voltage can be individually enabled for each state
502 * though => allow setting all states to support
503 * enabling power rail on different states.
505 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
506 ROHM_DVS_LEVEL_SUSPEND
|
508 .run_reg
= BD71828_REG_LDO2_VOLT
,
509 .run_mask
= BD71828_MASK_LDO_VOLT
,
510 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
511 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
512 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
517 .of_match
= of_match_ptr("LDO3"),
518 .regulators_node
= of_match_ptr("regulators"),
520 .ops
= &bd71828_ldo_ops
,
521 .type
= REGULATOR_VOLTAGE
,
522 .linear_ranges
= bd71828_ldo_volts
,
523 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
524 .n_voltages
= BD71828_LDO_VOLTS
,
525 .enable_reg
= BD71828_REG_LDO3_EN
,
526 .enable_mask
= BD71828_MASK_RUN_EN
,
527 .vsel_reg
= BD71828_REG_LDO3_VOLT
,
528 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
529 .owner
= THIS_MODULE
,
530 .of_parse_cb
= buck_set_hw_dvs_levels
,
534 * LDO3 only supports single voltage for all states.
535 * voltage can be individually enabled for each state
536 * though => allow setting all states to support
537 * enabling power rail on different states.
539 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
540 ROHM_DVS_LEVEL_SUSPEND
|
542 .run_reg
= BD71828_REG_LDO3_VOLT
,
543 .run_mask
= BD71828_MASK_LDO_VOLT
,
544 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
545 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
546 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
552 .of_match
= of_match_ptr("LDO4"),
553 .regulators_node
= of_match_ptr("regulators"),
555 .ops
= &bd71828_ldo_ops
,
556 .type
= REGULATOR_VOLTAGE
,
557 .linear_ranges
= bd71828_ldo_volts
,
558 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
559 .n_voltages
= BD71828_LDO_VOLTS
,
560 .enable_reg
= BD71828_REG_LDO4_EN
,
561 .enable_mask
= BD71828_MASK_RUN_EN
,
562 .vsel_reg
= BD71828_REG_LDO4_VOLT
,
563 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
564 .owner
= THIS_MODULE
,
565 .of_parse_cb
= buck_set_hw_dvs_levels
,
569 * LDO1 only supports single voltage for all states.
570 * voltage can be individually enabled for each state
571 * though => allow setting all states to support
572 * enabling power rail on different states.
574 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
575 ROHM_DVS_LEVEL_SUSPEND
|
577 .run_reg
= BD71828_REG_LDO4_VOLT
,
578 .run_mask
= BD71828_MASK_LDO_VOLT
,
579 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
580 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
581 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
586 .of_match
= of_match_ptr("LDO5"),
587 .regulators_node
= of_match_ptr("regulators"),
589 .ops
= &bd71828_ldo_ops
,
590 .type
= REGULATOR_VOLTAGE
,
591 .linear_ranges
= bd71828_ldo_volts
,
592 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
593 .n_voltages
= BD71828_LDO_VOLTS
,
594 .enable_reg
= BD71828_REG_LDO5_EN
,
595 .enable_mask
= BD71828_MASK_RUN_EN
,
596 .vsel_reg
= BD71828_REG_LDO5_VOLT
,
597 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
598 .of_parse_cb
= buck_set_hw_dvs_levels
,
599 .owner
= THIS_MODULE
,
602 * LDO5 is special. It can choose vsel settings to be configured
603 * from 2 different registers (by GPIO).
605 * This driver supports only configuration where
606 * BD71828_REG_LDO5_VOLT_L is used.
609 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
610 ROHM_DVS_LEVEL_SUSPEND
|
612 .run_reg
= BD71828_REG_LDO5_VOLT
,
613 .run_mask
= BD71828_MASK_LDO_VOLT
,
614 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
615 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
616 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
622 .of_match
= of_match_ptr("LDO6"),
623 .regulators_node
= of_match_ptr("regulators"),
625 .ops
= &bd71828_ldo6_ops
,
626 .type
= REGULATOR_VOLTAGE
,
627 .fixed_uV
= BD71828_LDO_6_VOLTAGE
,
629 .enable_reg
= BD71828_REG_LDO6_EN
,
630 .enable_mask
= BD71828_MASK_RUN_EN
,
631 .owner
= THIS_MODULE
,
633 * LDO6 only supports enable/disable for all states.
634 * Voltage for LDO6 is fixed.
636 .of_parse_cb
= ldo6_parse_dt
,
640 /* SNVS LDO in data-sheet */
642 .of_match
= of_match_ptr("LDO7"),
643 .regulators_node
= of_match_ptr("regulators"),
644 .id
= BD71828_LDO_SNVS
,
645 .ops
= &bd71828_ldo_ops
,
646 .type
= REGULATOR_VOLTAGE
,
647 .linear_ranges
= bd71828_ldo_volts
,
648 .n_linear_ranges
= ARRAY_SIZE(bd71828_ldo_volts
),
649 .n_voltages
= BD71828_LDO_VOLTS
,
650 .enable_reg
= BD71828_REG_LDO7_EN
,
651 .enable_mask
= BD71828_MASK_RUN_EN
,
652 .vsel_reg
= BD71828_REG_LDO7_VOLT
,
653 .vsel_mask
= BD71828_MASK_LDO_VOLT
,
654 .owner
= THIS_MODULE
,
655 .of_parse_cb
= buck_set_hw_dvs_levels
,
659 * LDO7 only supports single voltage for all states.
660 * voltage can be individually enabled for each state
661 * though => allow setting all states to support
662 * enabling power rail on different states.
664 .level_map
= ROHM_DVS_LEVEL_RUN
| ROHM_DVS_LEVEL_IDLE
|
665 ROHM_DVS_LEVEL_SUSPEND
|
667 .run_reg
= BD71828_REG_LDO7_VOLT
,
668 .idle_reg
= BD71828_REG_LDO7_VOLT
,
669 .suspend_reg
= BD71828_REG_LDO7_VOLT
,
670 .lpsr_reg
= BD71828_REG_LDO7_VOLT
,
671 .run_mask
= BD71828_MASK_LDO_VOLT
,
672 .idle_on_mask
= BD71828_MASK_IDLE_EN
,
673 .suspend_on_mask
= BD71828_MASK_SUSP_EN
,
674 .lpsr_on_mask
= BD71828_MASK_LPSR_EN
,
680 static int bd71828_probe(struct platform_device
*pdev
)
683 struct regulator_config config
= {
684 .dev
= pdev
->dev
.parent
,
687 config
.regmap
= dev_get_regmap(pdev
->dev
.parent
, NULL
);
691 for (i
= 0; i
< ARRAY_SIZE(bd71828_rdata
); i
++) {
692 struct regulator_dev
*rdev
;
693 const struct bd71828_regulator_data
*rd
;
695 rd
= &bd71828_rdata
[i
];
696 rdev
= devm_regulator_register(&pdev
->dev
,
699 return dev_err_probe(&pdev
->dev
, PTR_ERR(rdev
),
700 "failed to register %s regulator\n",
703 for (j
= 0; j
< rd
->reg_init_amnt
; j
++) {
704 ret
= regmap_update_bits(config
.regmap
,
705 rd
->reg_inits
[j
].reg
,
706 rd
->reg_inits
[j
].mask
,
707 rd
->reg_inits
[j
].val
);
709 return dev_err_probe(&pdev
->dev
, ret
,
710 "regulator %s init failed\n",
717 static struct platform_driver bd71828_regulator
= {
719 .name
= "bd71828-pmic",
720 .probe_type
= PROBE_PREFER_ASYNCHRONOUS
,
722 .probe
= bd71828_probe
,
725 module_platform_driver(bd71828_regulator
);
727 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
728 MODULE_DESCRIPTION("BD71828 voltage regulator driver");
729 MODULE_LICENSE("GPL");
730 MODULE_ALIAS("platform:bd71828-pmic");