]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/regulator/bd71815-regulator.c
drm/i915: Use the correct IRQ during resume
[mirror_ubuntu-jammy-kernel.git] / drivers / regulator / bd71815-regulator.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 //
3 // Copyright 2014 Embest Technology Co. Ltd. Inc.
4 // bd71815-regulator.c ROHM BD71815 regulator driver
5 //
6 // Author: Tony Luo <luofc@embedinfo.com>
7 //
8 // Partially rewritten at 2021 by
9 // Matti Vaittinen <matti.vaitinen@fi.rohmeurope.com>
10
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/err.h>
15 #include <linux/platform_device.h>
16 #include <linux/regulator/driver.h>
17 #include <linux/delay.h>
18 #include <linux/slab.h>
19 #include <linux/gpio.h>
20 #include <linux/mfd/rohm-generic.h>
21 #include <linux/mfd/rohm-bd71815.h>
22 #include <linux/regulator/of_regulator.h>
23
24 struct bd71815_regulator {
25 struct regulator_desc desc;
26 const struct rohm_dvs_config *dvs;
27 };
28
29 struct bd71815_pmic {
30 struct bd71815_regulator descs[BD71815_REGULATOR_CNT];
31 struct regmap *regmap;
32 struct device *dev;
33 struct gpio_descs *gps;
34 struct regulator_dev *rdev[BD71815_REGULATOR_CNT];
35 };
36
37 static const int bd7181x_wled_currents[] = {
38 10, 20, 30, 50, 70, 100, 200, 300, 500, 700, 1000, 2000, 3000, 4000,
39 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, 15000,
40 16000, 17000, 18000, 19000, 20000, 21000, 22000, 23000, 24000, 25000,
41 };
42
43 static const struct rohm_dvs_config buck1_dvs = {
44 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
45 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
46 .run_reg = BD71815_REG_BUCK1_VOLT_H,
47 .run_mask = BD71815_VOLT_MASK,
48 .run_on_mask = BD71815_BUCK_RUN_ON,
49 .snvs_on_mask = BD71815_BUCK_SNVS_ON,
50 .suspend_reg = BD71815_REG_BUCK1_VOLT_L,
51 .suspend_mask = BD71815_VOLT_MASK,
52 .suspend_on_mask = BD71815_BUCK_SUSP_ON,
53 .lpsr_reg = BD71815_REG_BUCK1_VOLT_L,
54 .lpsr_mask = BD71815_VOLT_MASK,
55 .lpsr_on_mask = BD71815_BUCK_LPSR_ON,
56 };
57
58 static const struct rohm_dvs_config buck2_dvs = {
59 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
60 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
61 .run_reg = BD71815_REG_BUCK2_VOLT_H,
62 .run_mask = BD71815_VOLT_MASK,
63 .run_on_mask = BD71815_BUCK_RUN_ON,
64 .snvs_on_mask = BD71815_BUCK_SNVS_ON,
65 .suspend_reg = BD71815_REG_BUCK2_VOLT_L,
66 .suspend_mask = BD71815_VOLT_MASK,
67 .suspend_on_mask = BD71815_BUCK_SUSP_ON,
68 .lpsr_reg = BD71815_REG_BUCK2_VOLT_L,
69 .lpsr_mask = BD71815_VOLT_MASK,
70 .lpsr_on_mask = BD71815_BUCK_LPSR_ON,
71 };
72
73 static const struct rohm_dvs_config buck3_dvs = {
74 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
75 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
76 .run_reg = BD71815_REG_BUCK3_VOLT,
77 .run_mask = BD71815_VOLT_MASK,
78 .run_on_mask = BD71815_BUCK_RUN_ON,
79 .snvs_on_mask = BD71815_BUCK_SNVS_ON,
80 .suspend_on_mask = BD71815_BUCK_SUSP_ON,
81 .lpsr_on_mask = BD71815_BUCK_LPSR_ON,
82 };
83
84 static const struct rohm_dvs_config buck4_dvs = {
85 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
86 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
87 .run_reg = BD71815_REG_BUCK4_VOLT,
88 .run_mask = BD71815_VOLT_MASK,
89 .run_on_mask = BD71815_BUCK_RUN_ON,
90 .snvs_on_mask = BD71815_BUCK_SNVS_ON,
91 .suspend_on_mask = BD71815_BUCK_SUSP_ON,
92 .lpsr_on_mask = BD71815_BUCK_LPSR_ON,
93 };
94
95 static const struct rohm_dvs_config ldo1_dvs = {
96 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
97 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
98 .run_reg = BD71815_REG_LDO_MODE1,
99 .run_mask = BD71815_VOLT_MASK,
100 .run_on_mask = LDO1_RUN_ON,
101 .snvs_on_mask = LDO1_SNVS_ON,
102 .suspend_on_mask = LDO1_SUSP_ON,
103 .lpsr_on_mask = LDO1_LPSR_ON,
104 };
105
106 static const struct rohm_dvs_config ldo2_dvs = {
107 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
108 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
109 .run_reg = BD71815_REG_LDO_MODE2,
110 .run_mask = BD71815_VOLT_MASK,
111 .run_on_mask = LDO2_RUN_ON,
112 .snvs_on_mask = LDO2_SNVS_ON,
113 .suspend_on_mask = LDO2_SUSP_ON,
114 .lpsr_on_mask = LDO2_LPSR_ON,
115 };
116
117 static const struct rohm_dvs_config ldo3_dvs = {
118 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
119 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
120 .run_reg = BD71815_REG_LDO_MODE2,
121 .run_mask = BD71815_VOLT_MASK,
122 .run_on_mask = LDO3_RUN_ON,
123 .snvs_on_mask = LDO3_SNVS_ON,
124 .suspend_on_mask = LDO3_SUSP_ON,
125 .lpsr_on_mask = LDO3_LPSR_ON,
126 };
127
128 static const struct rohm_dvs_config ldo4_dvs = {
129 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
130 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
131 .run_reg = BD71815_REG_LDO_MODE3,
132 .run_mask = BD71815_VOLT_MASK,
133 .run_on_mask = LDO4_RUN_ON,
134 .snvs_on_mask = LDO4_SNVS_ON,
135 .suspend_on_mask = LDO4_SUSP_ON,
136 .lpsr_on_mask = LDO4_LPSR_ON,
137 };
138
139 static const struct rohm_dvs_config ldo5_dvs = {
140 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
141 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
142 .run_reg = BD71815_REG_LDO_MODE3,
143 .run_mask = BD71815_VOLT_MASK,
144 .run_on_mask = LDO5_RUN_ON,
145 .snvs_on_mask = LDO5_SNVS_ON,
146 .suspend_on_mask = LDO5_SUSP_ON,
147 .lpsr_on_mask = LDO5_LPSR_ON,
148 };
149
150 static const struct rohm_dvs_config dvref_dvs = {
151 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
152 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
153 .run_on_mask = DVREF_RUN_ON,
154 .snvs_on_mask = DVREF_SNVS_ON,
155 .suspend_on_mask = DVREF_SUSP_ON,
156 .lpsr_on_mask = DVREF_LPSR_ON,
157 };
158
159 static const struct rohm_dvs_config ldolpsr_dvs = {
160 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
161 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
162 .run_on_mask = DVREF_RUN_ON,
163 .snvs_on_mask = DVREF_SNVS_ON,
164 .suspend_on_mask = DVREF_SUSP_ON,
165 .lpsr_on_mask = DVREF_LPSR_ON,
166 };
167
168 static const struct rohm_dvs_config buck5_dvs = {
169 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_SNVS |
170 ROHM_DVS_LEVEL_SUSPEND | ROHM_DVS_LEVEL_LPSR,
171 .run_reg = BD71815_REG_BUCK5_VOLT,
172 .run_mask = BD71815_VOLT_MASK,
173 .run_on_mask = BD71815_BUCK_RUN_ON,
174 .snvs_on_mask = BD71815_BUCK_SNVS_ON,
175 .suspend_on_mask = BD71815_BUCK_SUSP_ON,
176 .lpsr_on_mask = BD71815_BUCK_LPSR_ON,
177 };
178
179 static int set_hw_dvs_levels(struct device_node *np,
180 const struct regulator_desc *desc,
181 struct regulator_config *cfg)
182 {
183 struct bd71815_regulator *data;
184
185 data = container_of(desc, struct bd71815_regulator, desc);
186 return rohm_regulator_set_dvs_levels(data->dvs, np, desc, cfg->regmap);
187 }
188
189 /*
190 * Bucks 1 and 2 have two voltage selection registers where selected
191 * voltage can be set. Which of the registers is used can be either controlled
192 * by a control bit in register - or by HW state. If HW state specific voltages
193 * are given - then we assume HW state based control should be used.
194 *
195 * If volatge value is updated to currently selected register - then output
196 * voltage is immediately changed no matter what is set as ramp rate. Thus we
197 * default changing voltage by writing new value to inactive register and
198 * then updating the 'register selection' bit. This naturally only works when
199 * HW state machine is not used to select the voltage.
200 */
201 static int buck12_set_hw_dvs_levels(struct device_node *np,
202 const struct regulator_desc *desc,
203 struct regulator_config *cfg)
204 {
205 struct bd71815_regulator *data;
206 int ret = 0, val;
207
208 data = container_of(desc, struct bd71815_regulator, desc);
209
210 if (of_find_property(np, "rohm,dvs-run-voltage", NULL) ||
211 of_find_property(np, "rohm,dvs-suspend-voltage", NULL) ||
212 of_find_property(np, "rohm,dvs-lpsr-voltage", NULL) ||
213 of_find_property(np, "rohm,dvs-snvs-voltage", NULL)) {
214 ret = regmap_read(cfg->regmap, desc->vsel_reg, &val);
215 if (ret)
216 return ret;
217
218 if (!(BD71815_BUCK_STBY_DVS & val) &&
219 !(BD71815_BUCK_DVSSEL & val)) {
220 int val2;
221
222 /*
223 * We are currently using voltage from _L.
224 * We'd better copy it to _H and switch to it to
225 * avoid shutting us down if LPSR or SUSPEND is set to
226 * disabled. _L value is at reg _H + 1
227 */
228 ret = regmap_read(cfg->regmap, desc->vsel_reg + 1,
229 &val2);
230 if (ret)
231 return ret;
232
233 ret = regmap_update_bits(cfg->regmap, desc->vsel_reg,
234 BD71815_VOLT_MASK |
235 BD71815_BUCK_DVSSEL,
236 val2 | BD71815_BUCK_DVSSEL);
237 if (ret)
238 return ret;
239 }
240 ret = rohm_regulator_set_dvs_levels(data->dvs, np, desc,
241 cfg->regmap);
242 if (ret)
243 return ret;
244 /*
245 * DVS levels were given => use HW-state machine for voltage
246 * controls. NOTE: AFAIK, This means that if voltage is changed
247 * by SW the ramp-rate is not respected. Should we disable
248 * SW voltage control when the HW state machine is used?
249 */
250 ret = regmap_update_bits(cfg->regmap, desc->vsel_reg,
251 BD71815_BUCK_STBY_DVS,
252 BD71815_BUCK_STBY_DVS);
253 }
254
255 return ret;
256 }
257
258 /*
259 * BUCK1/2
260 * BUCK1RAMPRATE[1:0] BUCK1 DVS ramp rate setting
261 * 00: 10.00mV/usec 10mV 1uS
262 * 01: 5.00mV/usec 10mV 2uS
263 * 10: 2.50mV/usec 10mV 4uS
264 * 11: 1.25mV/usec 10mV 8uS
265 */
266 static const unsigned int bd7181x_ramp_table[] = { 1250, 2500, 5000, 10000 };
267
268 static int bd7181x_led_set_current_limit(struct regulator_dev *rdev,
269 int min_uA, int max_uA)
270 {
271 int ret;
272 int onstatus;
273
274 onstatus = regulator_is_enabled_regmap(rdev);
275
276 ret = regulator_set_current_limit_regmap(rdev, min_uA, max_uA);
277 if (!ret) {
278 int newstatus;
279
280 newstatus = regulator_is_enabled_regmap(rdev);
281 if (onstatus != newstatus) {
282 /*
283 * HW FIX: spurious led status change detected. Toggle
284 * state as a workaround
285 */
286 if (onstatus)
287 ret = regulator_enable_regmap(rdev);
288 else
289 ret = regulator_disable_regmap(rdev);
290
291 if (ret)
292 dev_err(rdev_get_dev(rdev),
293 "failed to revert the LED state (%d)\n",
294 ret);
295 }
296 }
297
298 return ret;
299 }
300
301 static int bd7181x_buck12_get_voltage_sel(struct regulator_dev *rdev)
302 {
303 struct bd71815_pmic *pmic = rdev_get_drvdata(rdev);
304 int rid = rdev_get_id(rdev);
305 int ret, regh, regl, val;
306
307 regh = BD71815_REG_BUCK1_VOLT_H + rid * 0x2;
308 regl = BD71815_REG_BUCK1_VOLT_L + rid * 0x2;
309
310 ret = regmap_read(pmic->regmap, regh, &val);
311 if (ret)
312 return ret;
313
314 /*
315 * If we use HW state machine based voltage reg selection - then we
316 * return BD71815_REG_BUCK1_VOLT_H which is used at RUN.
317 * Else we do return the BD71815_REG_BUCK1_VOLT_H or
318 * BD71815_REG_BUCK1_VOLT_L depending on which is selected to be used
319 * by BD71815_BUCK_DVSSEL bit
320 */
321 if ((!(val & BD71815_BUCK_STBY_DVS)) && (!(val & BD71815_BUCK_DVSSEL)))
322 ret = regmap_read(pmic->regmap, regl, &val);
323
324 if (ret)
325 return ret;
326
327 return val & BD71815_VOLT_MASK;
328 }
329
330 /*
331 * For Buck 1/2.
332 */
333 static int bd7181x_buck12_set_voltage_sel(struct regulator_dev *rdev,
334 unsigned int sel)
335 {
336 struct bd71815_pmic *pmic = rdev_get_drvdata(rdev);
337 int rid = rdev_get_id(rdev);
338 int ret, val, reg, regh, regl;
339
340 regh = BD71815_REG_BUCK1_VOLT_H + rid*0x2;
341 regl = BD71815_REG_BUCK1_VOLT_L + rid*0x2;
342
343 ret = regmap_read(pmic->regmap, regh, &val);
344 if (ret)
345 return ret;
346
347 /*
348 * If bucks 1 & 2 are controlled by state machine - then the RUN state
349 * voltage is set to BD71815_REG_BUCK1_VOLT_H. Changing SUSPEND/LPSR
350 * voltages at runtime is not supported by this driver.
351 */
352 if (((val & BD71815_BUCK_STBY_DVS))) {
353 return regmap_update_bits(pmic->regmap, regh, BD71815_VOLT_MASK,
354 sel);
355 }
356 /* Update new voltage to the register which is not selected now */
357 if (val & BD71815_BUCK_DVSSEL)
358 reg = regl;
359 else
360 reg = regh;
361
362 ret = regmap_update_bits(pmic->regmap, reg, BD71815_VOLT_MASK, sel);
363 if (ret)
364 return ret;
365
366 /* Select the other DVS register to be used */
367 return regmap_update_bits(pmic->regmap, regh, BD71815_BUCK_DVSSEL, ~val);
368 }
369
370 static const struct regulator_ops bd7181x_ldo_regulator_ops = {
371 .enable = regulator_enable_regmap,
372 .disable = regulator_disable_regmap,
373 .is_enabled = regulator_is_enabled_regmap,
374 .list_voltage = regulator_list_voltage_linear,
375 .set_voltage_sel = regulator_set_voltage_sel_regmap,
376 .get_voltage_sel = regulator_get_voltage_sel_regmap,
377 };
378
379 static const struct regulator_ops bd7181x_fixed_regulator_ops = {
380 .enable = regulator_enable_regmap,
381 .disable = regulator_disable_regmap,
382 .is_enabled = regulator_is_enabled_regmap,
383 .list_voltage = regulator_list_voltage_linear,
384 };
385
386 static const struct regulator_ops bd7181x_buck_regulator_ops = {
387 .enable = regulator_enable_regmap,
388 .disable = regulator_disable_regmap,
389 .is_enabled = regulator_is_enabled_regmap,
390 .list_voltage = regulator_list_voltage_linear,
391 .set_voltage_sel = regulator_set_voltage_sel_regmap,
392 .get_voltage_sel = regulator_get_voltage_sel_regmap,
393 .set_voltage_time_sel = regulator_set_voltage_time_sel,
394 };
395
396 static const struct regulator_ops bd7181x_buck12_regulator_ops = {
397 .enable = regulator_enable_regmap,
398 .disable = regulator_disable_regmap,
399 .is_enabled = regulator_is_enabled_regmap,
400 .list_voltage = regulator_list_voltage_linear,
401 .set_voltage_sel = bd7181x_buck12_set_voltage_sel,
402 .get_voltage_sel = bd7181x_buck12_get_voltage_sel,
403 .set_voltage_time_sel = regulator_set_voltage_time_sel,
404 .set_ramp_delay = regulator_set_ramp_delay_regmap,
405 };
406
407 static const struct regulator_ops bd7181x_led_regulator_ops = {
408 .enable = regulator_enable_regmap,
409 .disable = regulator_disable_regmap,
410 .is_enabled = regulator_is_enabled_regmap,
411 .set_current_limit = bd7181x_led_set_current_limit,
412 .get_current_limit = regulator_get_current_limit_regmap,
413 };
414
415 #define BD71815_FIXED_REG(_name, _id, ereg, emsk, voltage, _dvs) \
416 [(_id)] = { \
417 .desc = { \
418 .name = #_name, \
419 .of_match = of_match_ptr(#_name), \
420 .regulators_node = of_match_ptr("regulators"), \
421 .n_voltages = 1, \
422 .ops = &bd7181x_fixed_regulator_ops, \
423 .type = REGULATOR_VOLTAGE, \
424 .id = (_id), \
425 .owner = THIS_MODULE, \
426 .min_uV = (voltage), \
427 .enable_reg = (ereg), \
428 .enable_mask = (emsk), \
429 .of_parse_cb = set_hw_dvs_levels, \
430 }, \
431 .dvs = (_dvs), \
432 }
433
434 #define BD71815_BUCK_REG(_name, _id, vsel, ereg, min, max, step, _dvs) \
435 [(_id)] = { \
436 .desc = { \
437 .name = #_name, \
438 .of_match = of_match_ptr(#_name), \
439 .regulators_node = of_match_ptr("regulators"), \
440 .n_voltages = ((max) - (min)) / (step) + 1, \
441 .ops = &bd7181x_buck_regulator_ops, \
442 .type = REGULATOR_VOLTAGE, \
443 .id = (_id), \
444 .owner = THIS_MODULE, \
445 .min_uV = (min), \
446 .uV_step = (step), \
447 .vsel_reg = (vsel), \
448 .vsel_mask = BD71815_VOLT_MASK, \
449 .enable_reg = (ereg), \
450 .enable_mask = BD71815_BUCK_RUN_ON, \
451 .of_parse_cb = set_hw_dvs_levels, \
452 }, \
453 .dvs = (_dvs), \
454 }
455
456 #define BD71815_BUCK12_REG(_name, _id, vsel, ereg, min, max, step, \
457 _dvs) \
458 [(_id)] = { \
459 .desc = { \
460 .name = #_name, \
461 .of_match = of_match_ptr(#_name), \
462 .regulators_node = of_match_ptr("regulators"), \
463 .n_voltages = ((max) - (min)) / (step) + 1, \
464 .ops = &bd7181x_buck12_regulator_ops, \
465 .type = REGULATOR_VOLTAGE, \
466 .id = (_id), \
467 .owner = THIS_MODULE, \
468 .min_uV = (min), \
469 .uV_step = (step), \
470 .vsel_reg = (vsel), \
471 .vsel_mask = 0x3f, \
472 .enable_reg = (ereg), \
473 .enable_mask = 0x04, \
474 .ramp_reg = (ereg), \
475 .ramp_mask = BD71815_BUCK_RAMPRATE_MASK, \
476 .ramp_delay_table = bd7181x_ramp_table, \
477 .n_ramp_values = ARRAY_SIZE(bd7181x_ramp_table),\
478 .of_parse_cb = buck12_set_hw_dvs_levels, \
479 }, \
480 .dvs = (_dvs), \
481 }
482
483 #define BD71815_LED_REG(_name, _id, csel, mask, ereg, emsk, currents) \
484 [(_id)] = { \
485 .desc = { \
486 .name = #_name, \
487 .of_match = of_match_ptr(#_name), \
488 .regulators_node = of_match_ptr("regulators"), \
489 .n_current_limits = ARRAY_SIZE(currents), \
490 .ops = &bd7181x_led_regulator_ops, \
491 .type = REGULATOR_CURRENT, \
492 .id = (_id), \
493 .owner = THIS_MODULE, \
494 .curr_table = currents, \
495 .csel_reg = (csel), \
496 .csel_mask = (mask), \
497 .enable_reg = (ereg), \
498 .enable_mask = (emsk), \
499 }, \
500 }
501
502 #define BD71815_LDO_REG(_name, _id, vsel, ereg, emsk, min, max, step, \
503 _dvs) \
504 [(_id)] = { \
505 .desc = { \
506 .name = #_name, \
507 .of_match = of_match_ptr(#_name), \
508 .regulators_node = of_match_ptr("regulators"), \
509 .n_voltages = ((max) - (min)) / (step) + 1, \
510 .ops = &bd7181x_ldo_regulator_ops, \
511 .type = REGULATOR_VOLTAGE, \
512 .id = (_id), \
513 .owner = THIS_MODULE, \
514 .min_uV = (min), \
515 .uV_step = (step), \
516 .vsel_reg = (vsel), \
517 .vsel_mask = BD71815_VOLT_MASK, \
518 .enable_reg = (ereg), \
519 .enable_mask = (emsk), \
520 .of_parse_cb = set_hw_dvs_levels, \
521 }, \
522 .dvs = (_dvs), \
523 }
524
525 static struct bd71815_regulator bd71815_regulators[] = {
526 BD71815_BUCK12_REG(buck1, BD71815_BUCK1, BD71815_REG_BUCK1_VOLT_H,
527 BD71815_REG_BUCK1_MODE, 800000, 2000000, 25000,
528 &buck1_dvs),
529 BD71815_BUCK12_REG(buck2, BD71815_BUCK2, BD71815_REG_BUCK2_VOLT_H,
530 BD71815_REG_BUCK2_MODE, 800000, 2000000, 25000,
531 &buck2_dvs),
532 BD71815_BUCK_REG(buck3, BD71815_BUCK3, BD71815_REG_BUCK3_VOLT,
533 BD71815_REG_BUCK3_MODE, 1200000, 2700000, 50000,
534 &buck3_dvs),
535 BD71815_BUCK_REG(buck4, BD71815_BUCK4, BD71815_REG_BUCK4_VOLT,
536 BD71815_REG_BUCK4_MODE, 1100000, 1850000, 25000,
537 &buck4_dvs),
538 BD71815_BUCK_REG(buck5, BD71815_BUCK5, BD71815_REG_BUCK5_VOLT,
539 BD71815_REG_BUCK5_MODE, 1800000, 3300000, 50000,
540 &buck5_dvs),
541 BD71815_LDO_REG(ldo1, BD71815_LDO1, BD71815_REG_LDO1_VOLT,
542 BD71815_REG_LDO_MODE1, LDO1_RUN_ON, 800000, 3300000,
543 50000, &ldo1_dvs),
544 BD71815_LDO_REG(ldo2, BD71815_LDO2, BD71815_REG_LDO2_VOLT,
545 BD71815_REG_LDO_MODE2, LDO2_RUN_ON, 800000, 3300000,
546 50000, &ldo2_dvs),
547 /*
548 * Let's default LDO3 to be enabled by SW. We can override ops if DT
549 * says LDO3 should be enabled by HW when DCIN is connected.
550 */
551 BD71815_LDO_REG(ldo3, BD71815_LDO3, BD71815_REG_LDO3_VOLT,
552 BD71815_REG_LDO_MODE2, LDO3_RUN_ON, 800000, 3300000,
553 50000, &ldo3_dvs),
554 BD71815_LDO_REG(ldo4, BD71815_LDO4, BD71815_REG_LDO4_VOLT,
555 BD71815_REG_LDO_MODE3, LDO4_RUN_ON, 800000, 3300000,
556 50000, &ldo4_dvs),
557 BD71815_LDO_REG(ldo5, BD71815_LDO5, BD71815_REG_LDO5_VOLT_H,
558 BD71815_REG_LDO_MODE3, LDO5_RUN_ON, 800000, 3300000,
559 50000, &ldo5_dvs),
560 BD71815_FIXED_REG(ldodvref, BD71815_LDODVREF, BD71815_REG_LDO_MODE4,
561 DVREF_RUN_ON, 3000000, &dvref_dvs),
562 BD71815_FIXED_REG(ldolpsr, BD71815_LDOLPSR, BD71815_REG_LDO_MODE4,
563 LDO_LPSR_RUN_ON, 1800000, &ldolpsr_dvs),
564 BD71815_LED_REG(wled, BD71815_WLED, BD71815_REG_LED_DIMM, LED_DIMM_MASK,
565 BD71815_REG_LED_CTRL, LED_RUN_ON,
566 bd7181x_wled_currents),
567 };
568
569 static int bd7181x_probe(struct platform_device *pdev)
570 {
571 struct bd71815_pmic *pmic;
572 struct regulator_config config = {};
573 int i, ret;
574 struct gpio_desc *ldo4_en;
575
576 pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
577 if (!pmic)
578 return -ENOMEM;
579
580 memcpy(pmic->descs, bd71815_regulators, sizeof(pmic->descs));
581
582 pmic->dev = &pdev->dev;
583 pmic->regmap = dev_get_regmap(pdev->dev.parent, NULL);
584 if (!pmic->regmap) {
585 dev_err(pmic->dev, "No parent regmap\n");
586 return -ENODEV;
587 }
588 platform_set_drvdata(pdev, pmic);
589 ldo4_en = devm_gpiod_get_from_of_node(&pdev->dev,
590 pdev->dev.parent->of_node,
591 "rohm,vsel-gpios", 0,
592 GPIOD_ASIS, "ldo4-en");
593
594 if (IS_ERR(ldo4_en)) {
595 ret = PTR_ERR(ldo4_en);
596 if (ret != -ENOENT)
597 return ret;
598 ldo4_en = NULL;
599 }
600
601 /* Disable to go to ship-mode */
602 ret = regmap_update_bits(pmic->regmap, BD71815_REG_PWRCTRL,
603 RESTARTEN, 0);
604 if (ret)
605 return ret;
606
607 config.dev = pdev->dev.parent;
608 config.regmap = pmic->regmap;
609
610 for (i = 0; i < BD71815_REGULATOR_CNT; i++) {
611 struct regulator_desc *desc;
612 struct regulator_dev *rdev;
613
614 desc = &pmic->descs[i].desc;
615 if (i == BD71815_LDO4)
616 config.ena_gpiod = ldo4_en;
617
618 config.driver_data = pmic;
619
620 rdev = devm_regulator_register(&pdev->dev, desc, &config);
621 if (IS_ERR(rdev)) {
622 dev_err(&pdev->dev,
623 "failed to register %s regulator\n",
624 desc->name);
625 return PTR_ERR(rdev);
626 }
627 config.ena_gpiod = NULL;
628 pmic->rdev[i] = rdev;
629 }
630 return 0;
631 }
632
633 static const struct platform_device_id bd7181x_pmic_id[] = {
634 { "bd71815-pmic", ROHM_CHIP_TYPE_BD71815 },
635 { },
636 };
637 MODULE_DEVICE_TABLE(platform, bd7181x_pmic_id);
638
639 static struct platform_driver bd7181x_regulator = {
640 .driver = {
641 .name = "bd7181x-pmic",
642 .owner = THIS_MODULE,
643 },
644 .probe = bd7181x_probe,
645 .id_table = bd7181x_pmic_id,
646 };
647 module_platform_driver(bd7181x_regulator);
648
649 MODULE_AUTHOR("Tony Luo <luofc@embedinfo.com>");
650 MODULE_DESCRIPTION("BD71815 voltage regulator driver");
651 MODULE_LICENSE("GPL v2");
652 MODULE_ALIAS("platform:bd7181x-pmic");