xref: /optee_os/core/drivers/stpmic1.c (revision 42032ea08de2a441b72e57b94ba48c259dd3aa71)
1 // SPDX-License-Identifier: BSD-3-Clause
2 /*
3  * Copyright (c) 2016-2020, STMicroelectronics - All Rights Reserved
4  */
5 
6 #include <assert.h>
7 #include <drivers/stpmic1.h>
8 #include <kernel/panic.h>
9 #include <platform_config.h>
10 #include <stdint.h>
11 #include <string.h>
12 #include <trace.h>
13 #include <util.h>
14 
15 struct regul_struct {
16 	const char *dt_node_name;
17 	const uint16_t *voltage_table;
18 	uint8_t voltage_table_size;
19 	uint8_t control_reg;
20 	uint8_t low_power_reg;
21 	uint8_t enable_pos;
22 	uint8_t pull_down_reg;
23 	uint8_t pull_down_pos;
24 	uint8_t mask_reset_reg;
25 	uint8_t mask_reset_pos;
26 };
27 
28 static struct i2c_handle_s *pmic_i2c_handle;
29 static uint16_t pmic_i2c_addr;
30 
31 /* Voltage tables in mV */
32 static const uint16_t buck1_voltage_table[] = {
33 	725,
34 	725,
35 	725,
36 	725,
37 	725,
38 	725,
39 	750,
40 	775,
41 	800,
42 	825,
43 	850,
44 	875,
45 	900,
46 	925,
47 	950,
48 	975,
49 	1000,
50 	1025,
51 	1050,
52 	1075,
53 	1100,
54 	1125,
55 	1150,
56 	1175,
57 	1200,
58 	1225,
59 	1250,
60 	1275,
61 	1300,
62 	1325,
63 	1350,
64 	1375,
65 	1400,
66 	1425,
67 	1450,
68 	1475,
69 	1500,
70 	1500,
71 	1500,
72 	1500,
73 	1500,
74 	1500,
75 	1500,
76 	1500,
77 	1500,
78 	1500,
79 	1500,
80 	1500,
81 	1500,
82 	1500,
83 	1500,
84 	1500,
85 	1500,
86 	1500,
87 	1500,
88 	1500,
89 	1500,
90 	1500,
91 	1500,
92 	1500,
93 	1500,
94 	1500,
95 	1500,
96 	1500,
97 };
98 
99 static const uint16_t buck2_voltage_table[] = {
100 	1000,
101 	1000,
102 	1000,
103 	1000,
104 	1000,
105 	1000,
106 	1000,
107 	1000,
108 	1000,
109 	1000,
110 	1000,
111 	1000,
112 	1000,
113 	1000,
114 	1000,
115 	1000,
116 	1000,
117 	1000,
118 	1050,
119 	1050,
120 	1100,
121 	1100,
122 	1150,
123 	1150,
124 	1200,
125 	1200,
126 	1250,
127 	1250,
128 	1300,
129 	1300,
130 	1350,
131 	1350,
132 	1400,
133 	1400,
134 	1450,
135 	1450,
136 	1500,
137 };
138 
139 static const uint16_t buck3_voltage_table[] = {
140 	1000,
141 	1000,
142 	1000,
143 	1000,
144 	1000,
145 	1000,
146 	1000,
147 	1000,
148 	1000,
149 	1000,
150 	1000,
151 	1000,
152 	1000,
153 	1000,
154 	1000,
155 	1000,
156 	1000,
157 	1000,
158 	1000,
159 	1000,
160 	1100,
161 	1100,
162 	1100,
163 	1100,
164 	1200,
165 	1200,
166 	1200,
167 	1200,
168 	1300,
169 	1300,
170 	1300,
171 	1300,
172 	1400,
173 	1400,
174 	1400,
175 	1400,
176 	1500,
177 	1600,
178 	1700,
179 	1800,
180 	1900,
181 	2000,
182 	2100,
183 	2200,
184 	2300,
185 	2400,
186 	2500,
187 	2600,
188 	2700,
189 	2800,
190 	2900,
191 	3000,
192 	3100,
193 	3200,
194 	3300,
195 	3400,
196 };
197 
198 static const uint16_t buck4_voltage_table[] = {
199 	600,
200 	625,
201 	650,
202 	675,
203 	700,
204 	725,
205 	750,
206 	775,
207 	800,
208 	825,
209 	850,
210 	875,
211 	900,
212 	925,
213 	950,
214 	975,
215 	1000,
216 	1025,
217 	1050,
218 	1075,
219 	1100,
220 	1125,
221 	1150,
222 	1175,
223 	1200,
224 	1225,
225 	1250,
226 	1275,
227 	1300,
228 	1300,
229 	1350,
230 	1350,
231 	1400,
232 	1400,
233 	1450,
234 	1450,
235 	1500,
236 	1600,
237 	1700,
238 	1800,
239 	1900,
240 	2000,
241 	2100,
242 	2200,
243 	2300,
244 	2400,
245 	2500,
246 	2600,
247 	2700,
248 	2800,
249 	2900,
250 	3000,
251 	3100,
252 	3200,
253 	3300,
254 	3400,
255 	3500,
256 	3600,
257 	3700,
258 	3800,
259 	3900,
260 };
261 
262 static const uint16_t ldo1_voltage_table[] = {
263 	1700,
264 	1700,
265 	1700,
266 	1700,
267 	1700,
268 	1700,
269 	1700,
270 	1700,
271 	1700,
272 	1800,
273 	1900,
274 	2000,
275 	2100,
276 	2200,
277 	2300,
278 	2400,
279 	2500,
280 	2600,
281 	2700,
282 	2800,
283 	2900,
284 	3000,
285 	3100,
286 	3200,
287 	3300,
288 };
289 
290 static const uint16_t ldo2_voltage_table[] = {
291 	1700,
292 	1700,
293 	1700,
294 	1700,
295 	1700,
296 	1700,
297 	1700,
298 	1700,
299 	1700,
300 	1800,
301 	1900,
302 	2000,
303 	2100,
304 	2200,
305 	2300,
306 	2400,
307 	2500,
308 	2600,
309 	2700,
310 	2800,
311 	2900,
312 	3000,
313 	3100,
314 	3200,
315 	3300,
316 };
317 
318 static const uint16_t ldo3_voltage_table[] = {
319 	1700,
320 	1700,
321 	1700,
322 	1700,
323 	1700,
324 	1700,
325 	1700,
326 	1700,
327 	1700,
328 	1800,
329 	1900,
330 	2000,
331 	2100,
332 	2200,
333 	2300,
334 	2400,
335 	2500,
336 	2600,
337 	2700,
338 	2800,
339 	2900,
340 	3000,
341 	3100,
342 	3200,
343 	3300,
344 	3300,
345 	3300,
346 	3300,
347 	3300,
348 	3300,
349 	3300,
350 	500,	/* VOUT2/2 (Sink/source mode) */
351 	0xFFFF, /* VREFDDR */
352 };
353 
354 static const uint16_t ldo5_voltage_table[] = {
355 	1700,
356 	1700,
357 	1700,
358 	1700,
359 	1700,
360 	1700,
361 	1700,
362 	1700,
363 	1700,
364 	1800,
365 	1900,
366 	2000,
367 	2100,
368 	2200,
369 	2300,
370 	2400,
371 	2500,
372 	2600,
373 	2700,
374 	2800,
375 	2900,
376 	3000,
377 	3100,
378 	3200,
379 	3300,
380 	3400,
381 	3500,
382 	3600,
383 	3700,
384 	3800,
385 	3900,
386 };
387 
388 static const uint16_t ldo6_voltage_table[] = {
389 	900,
390 	1000,
391 	1100,
392 	1200,
393 	1300,
394 	1400,
395 	1500,
396 	1600,
397 	1700,
398 	1800,
399 	1900,
400 	2000,
401 	2100,
402 	2200,
403 	2300,
404 	2400,
405 	2500,
406 	2600,
407 	2700,
408 	2800,
409 	2900,
410 	3000,
411 	3100,
412 	3200,
413 	3300,
414 };
415 
416 static const uint16_t ldo4_voltage_table[] = {
417 	3300,
418 };
419 
420 static const uint16_t vref_ddr_voltage_table[] = {
421 	3300,
422 };
423 
424 /* Table of Regulators in PMIC SoC */
425 static const struct regul_struct regulators_table[] = {
426 	{
427 		.dt_node_name	= "buck1",
428 		.voltage_table	= buck1_voltage_table,
429 		.voltage_table_size = ARRAY_SIZE(buck1_voltage_table),
430 		.control_reg	= BUCK1_CONTROL_REG,
431 		.low_power_reg	= BUCK1_PWRCTRL_REG,
432 		.enable_pos	= LDO_BUCK_ENABLE_POS,
433 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
434 		.pull_down_pos	= BUCK1_PULL_DOWN_SHIFT,
435 		.mask_reset_reg = MASK_RESET_BUCK_REG,
436 		.mask_reset_pos = BUCK1_MASK_RESET_SHIFT,
437 	},
438 	{
439 		.dt_node_name	= "buck2",
440 		.voltage_table	= buck2_voltage_table,
441 		.voltage_table_size = ARRAY_SIZE(buck2_voltage_table),
442 		.control_reg	= BUCK2_CONTROL_REG,
443 		.low_power_reg	= BUCK2_PWRCTRL_REG,
444 		.enable_pos	= LDO_BUCK_ENABLE_POS,
445 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
446 		.pull_down_pos	= BUCK2_PULL_DOWN_SHIFT,
447 		.mask_reset_reg = MASK_RESET_BUCK_REG,
448 		.mask_reset_pos = BUCK2_MASK_RESET_SHIFT,
449 	},
450 	{
451 		.dt_node_name	= "buck3",
452 		.voltage_table	= buck3_voltage_table,
453 		.voltage_table_size = ARRAY_SIZE(buck3_voltage_table),
454 		.control_reg	= BUCK3_CONTROL_REG,
455 		.low_power_reg	= BUCK3_PWRCTRL_REG,
456 		.enable_pos	= LDO_BUCK_ENABLE_POS,
457 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
458 		.pull_down_pos	= BUCK3_PULL_DOWN_SHIFT,
459 		.mask_reset_reg = MASK_RESET_BUCK_REG,
460 		.mask_reset_pos = BUCK3_MASK_RESET_SHIFT,
461 	},
462 	{
463 		.dt_node_name	= "buck4",
464 		.voltage_table	= buck4_voltage_table,
465 		.voltage_table_size = ARRAY_SIZE(buck4_voltage_table),
466 		.control_reg	= BUCK4_CONTROL_REG,
467 		.low_power_reg	= BUCK4_PWRCTRL_REG,
468 		.enable_pos	= LDO_BUCK_ENABLE_POS,
469 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
470 		.pull_down_pos	= BUCK4_PULL_DOWN_SHIFT,
471 		.mask_reset_reg = MASK_RESET_BUCK_REG,
472 		.mask_reset_pos = BUCK4_MASK_RESET_SHIFT,
473 	},
474 	{
475 		.dt_node_name	= "ldo1",
476 		.voltage_table	= ldo1_voltage_table,
477 		.voltage_table_size = ARRAY_SIZE(ldo1_voltage_table),
478 		.control_reg	= LDO1_CONTROL_REG,
479 		.low_power_reg	= LDO1_PWRCTRL_REG,
480 		.enable_pos	= LDO_BUCK_ENABLE_POS,
481 		.mask_reset_reg = MASK_RESET_LDO_REG,
482 		.mask_reset_pos = LDO1_MASK_RESET_SHIFT,
483 	},
484 	{
485 		.dt_node_name	= "ldo2",
486 		.voltage_table	= ldo2_voltage_table,
487 		.voltage_table_size = ARRAY_SIZE(ldo2_voltage_table),
488 		.control_reg	= LDO2_CONTROL_REG,
489 		.low_power_reg	= LDO2_PWRCTRL_REG,
490 		.enable_pos	= LDO_BUCK_ENABLE_POS,
491 		.mask_reset_reg = MASK_RESET_LDO_REG,
492 		.mask_reset_pos = LDO2_MASK_RESET_SHIFT,
493 	},
494 	{
495 		.dt_node_name	= "ldo3",
496 		.voltage_table	= ldo3_voltage_table,
497 		.voltage_table_size = ARRAY_SIZE(ldo3_voltage_table),
498 		.control_reg	= LDO3_CONTROL_REG,
499 		.low_power_reg	= LDO3_PWRCTRL_REG,
500 		.enable_pos	= LDO_BUCK_ENABLE_POS,
501 		.mask_reset_reg = MASK_RESET_LDO_REG,
502 		.mask_reset_pos = LDO3_MASK_RESET_SHIFT,
503 	},
504 	{
505 		.dt_node_name	= "ldo4",
506 		.voltage_table	= ldo4_voltage_table,
507 		.voltage_table_size = ARRAY_SIZE(ldo4_voltage_table),
508 		.control_reg	= LDO4_CONTROL_REG,
509 		.low_power_reg	= LDO4_PWRCTRL_REG,
510 		.enable_pos	= LDO_BUCK_ENABLE_POS,
511 		.mask_reset_reg = MASK_RESET_LDO_REG,
512 		.mask_reset_pos = LDO4_MASK_RESET_SHIFT,
513 	},
514 	{
515 		.dt_node_name	= "ldo5",
516 		.voltage_table	= ldo5_voltage_table,
517 		.voltage_table_size = ARRAY_SIZE(ldo5_voltage_table),
518 		.control_reg	= LDO5_CONTROL_REG,
519 		.low_power_reg	= LDO5_PWRCTRL_REG,
520 		.enable_pos	= LDO_BUCK_ENABLE_POS,
521 		.mask_reset_reg = MASK_RESET_LDO_REG,
522 		.mask_reset_pos = LDO5_MASK_RESET_SHIFT,
523 	},
524 	{
525 		.dt_node_name	= "ldo6",
526 		.voltage_table	= ldo6_voltage_table,
527 		.voltage_table_size = ARRAY_SIZE(ldo6_voltage_table),
528 		.control_reg	= LDO6_CONTROL_REG,
529 		.low_power_reg	= LDO6_PWRCTRL_REG,
530 		.enable_pos	= LDO_BUCK_ENABLE_POS,
531 		.mask_reset_reg = MASK_RESET_LDO_REG,
532 		.mask_reset_pos = LDO6_MASK_RESET_SHIFT,
533 	},
534 	{
535 		.dt_node_name	= "vref_ddr",
536 		.voltage_table	= vref_ddr_voltage_table,
537 		.voltage_table_size = ARRAY_SIZE(vref_ddr_voltage_table),
538 		.control_reg	= VREF_DDR_CONTROL_REG,
539 		.low_power_reg	= VREF_DDR_PWRCTRL_REG,
540 		.enable_pos	= LDO_BUCK_ENABLE_POS,
541 		.mask_reset_reg = MASK_RESET_LDO_REG,
542 		.mask_reset_pos = VREF_DDR_MASK_RESET_SHIFT,
543 	},
544 	{
545 		.dt_node_name = "boost",
546 	},
547 	{
548 		.dt_node_name = "pwr_sw1",
549 	},
550 	{
551 		.dt_node_name = "pwr_sw2",
552 	},
553 };
554 
555 static const struct regul_struct *get_regulator_data(const char *name)
556 {
557 	unsigned int i = 0;
558 
559 	for (i = 0; i < ARRAY_SIZE(regulators_table); i++)
560 		if (strcmp(name, regulators_table[i].dt_node_name) == 0)
561 			return &regulators_table[i];
562 
563 	/* Regulator not found */
564 	panic(name);
565 }
566 
567 static uint8_t voltage_to_index(const char *name, uint16_t millivolts)
568 {
569 	const struct regul_struct *regul = get_regulator_data(name);
570 	unsigned int i = 0;
571 
572 	assert(regul->voltage_table);
573 	for (i = 0; i < regul->voltage_table_size; i++)
574 		if (regul->voltage_table[i] == millivolts)
575 			return i;
576 
577 	/* Voltage not found */
578 	panic(name);
579 }
580 
581 int stpmic1_powerctrl_on(void)
582 {
583 	return stpmic1_register_update(MAIN_CONTROL_REG, PWRCTRL_PIN_VALID,
584 				       PWRCTRL_PIN_VALID);
585 }
586 
587 int stpmic1_switch_off(void)
588 {
589 	return stpmic1_register_update(MAIN_CONTROL_REG, 1,
590 				       SOFTWARE_SWITCH_OFF_ENABLED);
591 }
592 
593 int stpmic1_regulator_enable(const char *name)
594 {
595 	const struct regul_struct *regul = get_regulator_data(name);
596 
597 	return stpmic1_register_update(regul->control_reg,
598 				       BIT(regul->enable_pos),
599 				       BIT(regul->enable_pos));
600 }
601 
602 int stpmic1_regulator_disable(const char *name)
603 {
604 	const struct regul_struct *regul = get_regulator_data(name);
605 
606 	return stpmic1_register_update(regul->control_reg, 0,
607 				       BIT(regul->enable_pos));
608 }
609 
610 bool stpmic1_is_regulator_enabled(const char *name)
611 {
612 	const struct regul_struct *regul = get_regulator_data(name);
613 	uint8_t val = 0;
614 
615 	if (stpmic1_register_read(regul->control_reg, &val))
616 		panic();
617 
618 	return val & BIT(regul->enable_pos);
619 }
620 
621 int stpmic1_regulator_voltage_set(const char *name, uint16_t millivolts)
622 {
623 	uint8_t voltage_index = voltage_to_index(name, millivolts);
624 	const struct regul_struct *regul = get_regulator_data(name);
625 	uint8_t mask = 0;
626 
627 	/* Voltage can be set for buck<N> or ldo<N> (except ldo4) regulators */
628 	if (!strcmp(name, "buck"))
629 		mask = BUCK_VOLTAGE_MASK;
630 	else if (!strcmp(name, "ldo") && strcmp(name, "ldo4"))
631 		mask = LDO_VOLTAGE_MASK;
632 	else
633 		return 0;
634 
635 	return stpmic1_register_update(regul->control_reg,
636 				       voltage_index << LDO_BUCK_VOLTAGE_SHIFT,
637 				       mask);
638 }
639 
640 int stpmic1_regulator_mask_reset_set(const char *name)
641 {
642 	const struct regul_struct *regul = get_regulator_data(name);
643 
644 	return stpmic1_register_update(regul->mask_reset_reg,
645 				       BIT(regul->mask_reset_pos),
646 				       LDO_BUCK_RESET_MASK <<
647 				       regul->mask_reset_pos);
648 }
649 
650 int stpmic1_bo_enable_unpg(struct stpmic1_bo_cfg *cfg)
651 {
652 	return stpmic1_register_update(cfg->ctrl_reg,
653 				       BIT(cfg->enable_pos),
654 				       BIT(cfg->enable_pos));
655 }
656 
657 /* Returns 1 if no configuration are expected applied at runtime, 0 otherwise */
658 int stpmic1_bo_voltage_cfg(const char *name, uint16_t millivolts,
659 			   struct stpmic1_bo_cfg *cfg)
660 {
661 	uint8_t voltage_index = voltage_to_index(name, millivolts);
662 	const struct regul_struct *regul = get_regulator_data(name);
663 	uint8_t mask = 0;
664 
665 	/* Voltage can be set for buck<N> or ldo<N> (except ldo4) regulators */
666 	if (!strcmp(name, "buck"))
667 		mask = BUCK_VOLTAGE_MASK;
668 	else if (!strcmp(name, "ldo") && strcmp(name, "ldo4"))
669 		mask = LDO_VOLTAGE_MASK;
670 	else
671 		return 1;
672 
673 	cfg->ctrl_reg = regul->control_reg;
674 	cfg->value = voltage_index << LDO_BUCK_VOLTAGE_SHIFT;
675 	cfg->mask = mask;
676 
677 	return 0;
678 }
679 
680 int stpmic1_bo_voltage_unpg(struct stpmic1_bo_cfg *cfg)
681 {
682 	return stpmic1_register_update(cfg->ctrl_reg, cfg->value, cfg->mask);
683 }
684 
685 int stpmic1_bo_pull_down_cfg(const char *name, struct stpmic1_bo_cfg *cfg)
686 {
687 	const struct regul_struct *regul = get_regulator_data(name);
688 
689 	cfg->pd_reg = regul->pull_down_reg;
690 	cfg->pd_value = BIT(regul->pull_down_pos);
691 	cfg->pd_mask = LDO_BUCK_PULL_DOWN_MASK << regul->pull_down_pos;
692 
693 	return 0;
694 }
695 
696 int stpmic1_bo_pull_down_unpg(struct stpmic1_bo_cfg *cfg)
697 {
698 	return stpmic1_register_update(cfg->pd_reg, cfg->pd_value,
699 				       cfg->pd_mask);
700 }
701 
702 int stpmic1_bo_mask_reset_cfg(const char *name, struct stpmic1_bo_cfg *cfg)
703 {
704 	const struct regul_struct *regul = get_regulator_data(name);
705 
706 	cfg->mrst_reg = regul->mask_reset_reg;
707 	cfg->mrst_value = BIT(regul->mask_reset_pos);
708 	cfg->mrst_mask = LDO_BUCK_RESET_MASK << regul->mask_reset_pos;
709 
710 	return 0;
711 }
712 
713 int stpmic1_bo_mask_reset_unpg(struct stpmic1_bo_cfg *cfg)
714 {
715 	return stpmic1_register_update(cfg->mrst_reg, cfg->mrst_value,
716 				       cfg->mrst_mask);
717 }
718 
719 int stpmic1_regulator_voltage_get(const char *name)
720 {
721 	const struct regul_struct *regul = get_regulator_data(name);
722 	uint8_t value = 0;
723 	uint8_t mask = 0;
724 
725 	/* Voltage can be set for buck<N> or ldo<N> (except ldo4) regulators */
726 	if (!strcmp(name, "buck"))
727 		mask = BUCK_VOLTAGE_MASK;
728 	else if (!strcmp(name, "ldo") && strcmp(name, "ldo4"))
729 		mask = LDO_VOLTAGE_MASK;
730 	else
731 		return 0;
732 
733 	if (stpmic1_register_read(regul->control_reg, &value))
734 		return -1;
735 
736 	value = (value & mask) >> LDO_BUCK_VOLTAGE_SHIFT;
737 
738 	if (value > regul->voltage_table_size)
739 		return -1;
740 
741 	return regul->voltage_table[value];
742 }
743 
744 int stpmic1_lp_copy_reg(const char *name)
745 {
746 	const struct regul_struct *regul = get_regulator_data(name);
747 	uint8_t val = 0;
748 	int status = 0;
749 
750 	status = stpmic1_register_read(regul->control_reg, &val);
751 	if (status)
752 		return status;
753 
754 	return stpmic1_register_write(regul->low_power_reg, val);
755 }
756 
757 int stpmic1_lp_cfg(const char *name, struct stpmic1_lp_cfg *cfg)
758 {
759 	const struct regul_struct *regul = get_regulator_data(name);
760 
761 	cfg->ctrl_reg = regul->control_reg;
762 	cfg->lp_reg = regul->low_power_reg;
763 
764 	return 0;
765 }
766 
767 int stpmic1_lp_load_unpg(struct stpmic1_lp_cfg *cfg)
768 {
769 	uint8_t val = 0;
770 	int status = 0;
771 
772 	status = stpmic1_register_read(cfg->ctrl_reg, &val);
773 	if (!status)
774 		status = stpmic1_register_write(cfg->lp_reg, val);
775 
776 	return status;
777 }
778 
779 int stpmic1_lp_reg_on_off(const char *name, uint8_t enable)
780 {
781 	const struct regul_struct *regul = get_regulator_data(name);
782 
783 	return stpmic1_register_update(regul->low_power_reg, enable,
784 				       LDO_BUCK_ENABLE_MASK);
785 }
786 
787 int stpmic1_lp_on_off_unpg(struct stpmic1_lp_cfg *cfg, int enable)
788 {
789 	assert(enable == 0 || enable == 1);
790 	return stpmic1_register_update(cfg->lp_reg, enable,
791 				       LDO_BUCK_ENABLE_MASK);
792 }
793 
794 int stpmic1_lp_set_mode(const char *name, uint8_t hplp)
795 {
796 	const struct regul_struct *regul = get_regulator_data(name);
797 
798 	return stpmic1_register_update(regul->low_power_reg,
799 				       hplp << LDO_BUCK_HPLP_POS,
800 				       BIT(LDO_BUCK_HPLP_POS));
801 }
802 
803 int stpmic1_lp_mode_unpg(struct stpmic1_lp_cfg *cfg, unsigned int mode)
804 {
805 	assert(mode == 0 || mode == 1);
806 	return stpmic1_register_update(cfg->lp_reg,
807 				       mode << LDO_BUCK_HPLP_POS,
808 				       BIT(LDO_BUCK_HPLP_POS));
809 }
810 
811 int stpmic1_lp_set_voltage(const char *name, uint16_t millivolts)
812 {
813 	uint8_t voltage_index = voltage_to_index(name, millivolts);
814 	const struct regul_struct *regul = get_regulator_data(name);
815 	uint8_t mask = 0;
816 
817 	/* Voltage can be set for buck<N> or ldo<N> (except ldo4) regulators */
818 	if (!strcmp(name, "buck"))
819 		mask = BUCK_VOLTAGE_MASK;
820 	else if (!strcmp(name, "ldo") && strcmp(name, "ldo4"))
821 		mask = LDO_VOLTAGE_MASK;
822 	else
823 		return 0;
824 
825 	return stpmic1_register_update(regul->low_power_reg, voltage_index << 2,
826 				       mask);
827 }
828 
829 /* Returns 1 if no configuration are expected applied at runtime, 0 otherwise */
830 int stpmic1_lp_voltage_cfg(const char *name, uint16_t millivolts,
831 			   struct stpmic1_lp_cfg *cfg)
832 
833 {
834 	uint8_t voltage_index = voltage_to_index(name, millivolts);
835 	uint8_t mask = 0;
836 
837 	/* Voltage can be set for buck<N> or ldo<N> (except ldo4) regulators */
838 	if (!strcmp(name, "buck"))
839 		mask = BUCK_VOLTAGE_MASK;
840 	else if (!strcmp(name, "ldo") && strcmp(name, "ldo4"))
841 		mask = LDO_VOLTAGE_MASK;
842 	else
843 		return 1;
844 
845 	assert(cfg->lp_reg == get_regulator_data(name)->low_power_reg);
846 	cfg->value = voltage_index << 2;
847 	cfg->mask = mask;
848 
849 	return 0;
850 }
851 
852 int stpmic1_lp_voltage_unpg(struct stpmic1_lp_cfg *cfg)
853 {
854 	return stpmic1_register_update(cfg->lp_reg, cfg->value,	cfg->mask);
855 }
856 
857 int stpmic1_register_read(uint8_t register_id,  uint8_t *value)
858 {
859 	struct i2c_handle_s *i2c = pmic_i2c_handle;
860 
861 	return stm32_i2c_read_write_membyte(i2c, pmic_i2c_addr,
862 					    register_id, value,
863 					    false /* !write */);
864 }
865 
866 int stpmic1_register_write(uint8_t register_id, uint8_t value)
867 {
868 	struct i2c_handle_s *i2c = pmic_i2c_handle;
869 	uint8_t val = value;
870 
871 	return stm32_i2c_read_write_membyte(i2c, pmic_i2c_addr,
872 					    register_id, &val,
873 					    true /* write */);
874 }
875 
876 int stpmic1_register_update(uint8_t register_id, uint8_t value, uint8_t mask)
877 {
878 	int status = 0;
879 	uint8_t val = 0;
880 
881 	status = stpmic1_register_read(register_id, &val);
882 	if (status)
883 		return status;
884 
885 	val = (val & ~mask) | (value & mask);
886 
887 	return stpmic1_register_write(register_id, val);
888 }
889 
890 void stpmic1_bind_i2c(struct i2c_handle_s *i2c_handle, uint16_t i2c_addr)
891 {
892 	pmic_i2c_handle = i2c_handle;
893 	pmic_i2c_addr = i2c_addr;
894 }
895 
896 void stpmic1_dump_regulators(void)
897 {
898 	size_t i = 0;
899 	char __maybe_unused const *name = NULL;
900 
901 	for (i = 0; i < ARRAY_SIZE(regulators_table); i++) {
902 		if (!regulators_table[i].control_reg)
903 			continue;
904 
905 		name = regulators_table[i].dt_node_name;
906 		DMSG("PMIC regul %s: %sable, %dmV",
907 		     name, stpmic1_is_regulator_enabled(name) ? "en" : "dis",
908 		     stpmic1_regulator_voltage_get(name));
909 	}
910 }
911 
912 int stpmic1_get_version(unsigned long *version)
913 {
914 	uint8_t read_val = 0;
915 
916 	if (stpmic1_register_read(VERSION_STATUS_REG, &read_val))
917 		return -1;
918 
919 	*version = read_val;
920 	return 0;
921 }
922