xref: /rk3399_ARM-atf/drivers/st/pmic/stpmic1.c (revision 13fbfe046e71393961d2c70a4f748a15f9c15f77)
1 /*
2  * Copyright (c) 2016-2021, STMicroelectronics - All Rights Reserved
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <errno.h>
8 #include <string.h>
9 
10 #include <common/debug.h>
11 #include <drivers/st/stpmic1.h>
12 
13 #define I2C_TIMEOUT_MS		25
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 enable_mask;
21 	uint8_t low_power_reg;
22 	uint8_t pull_down_reg;
23 	uint8_t pull_down;
24 	uint8_t mask_reset_reg;
25 	uint8_t mask_reset;
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,
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 static const uint16_t fixed_5v_voltage_table[] = {
425 	5000,
426 };
427 
428 /* Table of Regulators in PMIC SoC */
429 static const struct regul_struct regulators_table[] = {
430 	{
431 		.dt_node_name	= "buck1",
432 		.voltage_table	= buck1_voltage_table,
433 		.voltage_table_size = ARRAY_SIZE(buck1_voltage_table),
434 		.control_reg	= BUCK1_CONTROL_REG,
435 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
436 		.low_power_reg	= BUCK1_PWRCTRL_REG,
437 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
438 		.pull_down	= BUCK1_PULL_DOWN_SHIFT,
439 		.mask_reset_reg	= MASK_RESET_BUCK_REG,
440 		.mask_reset	= BUCK1_MASK_RESET,
441 	},
442 	{
443 		.dt_node_name	= "buck2",
444 		.voltage_table	= buck2_voltage_table,
445 		.voltage_table_size = ARRAY_SIZE(buck2_voltage_table),
446 		.control_reg	= BUCK2_CONTROL_REG,
447 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
448 		.low_power_reg	= BUCK2_PWRCTRL_REG,
449 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
450 		.pull_down	= BUCK2_PULL_DOWN_SHIFT,
451 		.mask_reset_reg	= MASK_RESET_BUCK_REG,
452 		.mask_reset	= BUCK2_MASK_RESET,
453 	},
454 	{
455 		.dt_node_name	= "buck3",
456 		.voltage_table	= buck3_voltage_table,
457 		.voltage_table_size = ARRAY_SIZE(buck3_voltage_table),
458 		.control_reg	= BUCK3_CONTROL_REG,
459 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
460 		.low_power_reg	= BUCK3_PWRCTRL_REG,
461 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
462 		.pull_down	= BUCK3_PULL_DOWN_SHIFT,
463 		.mask_reset_reg	= MASK_RESET_BUCK_REG,
464 		.mask_reset	= BUCK3_MASK_RESET,
465 	},
466 	{
467 		.dt_node_name	= "buck4",
468 		.voltage_table	= buck4_voltage_table,
469 		.voltage_table_size = ARRAY_SIZE(buck4_voltage_table),
470 		.control_reg	= BUCK4_CONTROL_REG,
471 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
472 		.low_power_reg	= BUCK4_PWRCTRL_REG,
473 		.pull_down_reg	= BUCK_PULL_DOWN_REG,
474 		.pull_down	= BUCK4_PULL_DOWN_SHIFT,
475 		.mask_reset_reg	= MASK_RESET_BUCK_REG,
476 		.mask_reset	= BUCK4_MASK_RESET,
477 	},
478 	{
479 		.dt_node_name	= "ldo1",
480 		.voltage_table	= ldo1_voltage_table,
481 		.voltage_table_size = ARRAY_SIZE(ldo1_voltage_table),
482 		.control_reg	= LDO1_CONTROL_REG,
483 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
484 		.low_power_reg	= LDO1_PWRCTRL_REG,
485 		.mask_reset_reg	= MASK_RESET_LDO_REG,
486 		.mask_reset	= LDO1_MASK_RESET,
487 	},
488 	{
489 		.dt_node_name	= "ldo2",
490 		.voltage_table	= ldo2_voltage_table,
491 		.voltage_table_size = ARRAY_SIZE(ldo2_voltage_table),
492 		.control_reg	= LDO2_CONTROL_REG,
493 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
494 		.low_power_reg	= LDO2_PWRCTRL_REG,
495 		.mask_reset_reg	= MASK_RESET_LDO_REG,
496 		.mask_reset	= LDO2_MASK_RESET,
497 	},
498 	{
499 		.dt_node_name	= "ldo3",
500 		.voltage_table	= ldo3_voltage_table,
501 		.voltage_table_size = ARRAY_SIZE(ldo3_voltage_table),
502 		.control_reg	= LDO3_CONTROL_REG,
503 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
504 		.low_power_reg	= LDO3_PWRCTRL_REG,
505 		.mask_reset_reg	= MASK_RESET_LDO_REG,
506 		.mask_reset	= LDO3_MASK_RESET,
507 	},
508 	{
509 		.dt_node_name	= "ldo4",
510 		.voltage_table	= ldo4_voltage_table,
511 		.voltage_table_size = ARRAY_SIZE(ldo4_voltage_table),
512 		.control_reg	= LDO4_CONTROL_REG,
513 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
514 		.low_power_reg	= LDO4_PWRCTRL_REG,
515 		.mask_reset_reg	= MASK_RESET_LDO_REG,
516 		.mask_reset	= LDO4_MASK_RESET,
517 	},
518 	{
519 		.dt_node_name	= "ldo5",
520 		.voltage_table	= ldo5_voltage_table,
521 		.voltage_table_size = ARRAY_SIZE(ldo5_voltage_table),
522 		.control_reg	= LDO5_CONTROL_REG,
523 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
524 		.low_power_reg	= LDO5_PWRCTRL_REG,
525 		.mask_reset_reg	= MASK_RESET_LDO_REG,
526 		.mask_reset	= LDO5_MASK_RESET,
527 	},
528 	{
529 		.dt_node_name	= "ldo6",
530 		.voltage_table	= ldo6_voltage_table,
531 		.voltage_table_size = ARRAY_SIZE(ldo6_voltage_table),
532 		.control_reg	= LDO6_CONTROL_REG,
533 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
534 		.low_power_reg	= LDO6_PWRCTRL_REG,
535 		.mask_reset_reg	= MASK_RESET_LDO_REG,
536 		.mask_reset	= LDO6_MASK_RESET,
537 	},
538 	{
539 		.dt_node_name	= "vref_ddr",
540 		.voltage_table	= vref_ddr_voltage_table,
541 		.voltage_table_size = ARRAY_SIZE(vref_ddr_voltage_table),
542 		.control_reg	= VREF_DDR_CONTROL_REG,
543 		.enable_mask	= LDO_BUCK_ENABLE_MASK,
544 		.low_power_reg	= VREF_DDR_PWRCTRL_REG,
545 		.mask_reset_reg	= MASK_RESET_LDO_REG,
546 		.mask_reset	= VREF_DDR_MASK_RESET,
547 	},
548 	{
549 		.dt_node_name	= "boost",
550 		.voltage_table	= fixed_5v_voltage_table,
551 		.voltage_table_size = ARRAY_SIZE(fixed_5v_voltage_table),
552 		.control_reg	= USB_CONTROL_REG,
553 		.enable_mask	= BOOST_ENABLED,
554 	},
555 	{
556 		.dt_node_name	= "pwr_sw1",
557 		.voltage_table	= fixed_5v_voltage_table,
558 		.voltage_table_size = ARRAY_SIZE(fixed_5v_voltage_table),
559 		.control_reg	= USB_CONTROL_REG,
560 		.enable_mask	= USBSW_OTG_SWITCH_ENABLED,
561 	},
562 	{
563 		.dt_node_name	= "pwr_sw2",
564 		.voltage_table	= fixed_5v_voltage_table,
565 		.voltage_table_size = ARRAY_SIZE(fixed_5v_voltage_table),
566 		.control_reg	= USB_CONTROL_REG,
567 		.enable_mask	= SWIN_SWOUT_ENABLED,
568 	},
569 };
570 
571 #define MAX_REGUL	ARRAY_SIZE(regulators_table)
572 
573 static const struct regul_struct *get_regulator_data(const char *name)
574 {
575 	uint8_t i;
576 
577 	for (i = 0 ; i < MAX_REGUL ; i++) {
578 		if (strncmp(name, regulators_table[i].dt_node_name,
579 			    strlen(regulators_table[i].dt_node_name)) == 0) {
580 			return &regulators_table[i];
581 		}
582 	}
583 
584 	/* Regulator not found */
585 	panic();
586 	return NULL;
587 }
588 
589 static uint8_t voltage_to_index(const char *name, uint16_t millivolts)
590 {
591 	const struct regul_struct *regul = get_regulator_data(name);
592 	uint8_t i;
593 
594 	for (i = 0 ; i < regul->voltage_table_size ; i++) {
595 		if (regul->voltage_table[i] == millivolts) {
596 			return i;
597 		}
598 	}
599 
600 	/* Voltage not found */
601 	panic();
602 
603 	return 0;
604 }
605 
606 int stpmic1_powerctrl_on(void)
607 {
608 	return stpmic1_register_update(MAIN_CONTROL_REG, PWRCTRL_PIN_VALID,
609 				       PWRCTRL_PIN_VALID);
610 }
611 
612 int stpmic1_switch_off(void)
613 {
614 	return stpmic1_register_update(MAIN_CONTROL_REG, 1,
615 				       SOFTWARE_SWITCH_OFF_ENABLED);
616 }
617 
618 int stpmic1_regulator_enable(const char *name)
619 {
620 	const struct regul_struct *regul = get_regulator_data(name);
621 
622 	return stpmic1_register_update(regul->control_reg, regul->enable_mask,
623 				       regul->enable_mask);
624 }
625 
626 int stpmic1_regulator_disable(const char *name)
627 {
628 	const struct regul_struct *regul = get_regulator_data(name);
629 
630 	return stpmic1_register_update(regul->control_reg, 0,
631 				       regul->enable_mask);
632 }
633 
634 bool stpmic1_is_regulator_enabled(const char *name)
635 {
636 	uint8_t val;
637 	const struct regul_struct *regul = get_regulator_data(name);
638 
639 	if (stpmic1_register_read(regul->control_reg, &val) != 0) {
640 		panic();
641 	}
642 
643 	return (val & regul->enable_mask) == regul->enable_mask;
644 }
645 
646 int stpmic1_regulator_voltage_set(const char *name, uint16_t millivolts)
647 {
648 	uint8_t voltage_index = voltage_to_index(name, millivolts);
649 	const struct regul_struct *regul = get_regulator_data(name);
650 	uint8_t mask;
651 
652 	/* Voltage can be set for buck<N> or ldo<N> (except ldo4) regulators */
653 	if (strncmp(name, "buck", 4) == 0) {
654 		mask = BUCK_VOLTAGE_MASK;
655 	} else if ((strncmp(name, "ldo", 3) == 0) &&
656 		   (strncmp(name, "ldo4", 4) != 0)) {
657 		mask = LDO_VOLTAGE_MASK;
658 	} else {
659 		return 0;
660 	}
661 
662 	return stpmic1_register_update(regul->control_reg,
663 				       voltage_index << LDO_BUCK_VOLTAGE_SHIFT,
664 				       mask);
665 }
666 
667 int stpmic1_regulator_pull_down_set(const char *name)
668 {
669 	const struct regul_struct *regul = get_regulator_data(name);
670 
671 	if (regul->pull_down_reg != 0) {
672 		return stpmic1_register_update(regul->pull_down_reg,
673 					       BIT(regul->pull_down),
674 					       LDO_BUCK_PULL_DOWN_MASK <<
675 					       regul->pull_down);
676 	}
677 
678 	return 0;
679 }
680 
681 int stpmic1_regulator_mask_reset_set(const char *name)
682 {
683 	const struct regul_struct *regul = get_regulator_data(name);
684 
685 	return stpmic1_register_update(regul->mask_reset_reg,
686 				       BIT(regul->mask_reset),
687 				       LDO_BUCK_RESET_MASK <<
688 				       regul->mask_reset);
689 }
690 
691 int stpmic1_regulator_voltage_get(const char *name)
692 {
693 	const struct regul_struct *regul = get_regulator_data(name);
694 	uint8_t value;
695 	uint8_t mask;
696 	int status;
697 
698 	/* Voltage can be set for buck<N> or ldo<N> (except ldo4) regulators */
699 	if (strncmp(name, "buck", 4) == 0) {
700 		mask = BUCK_VOLTAGE_MASK;
701 	} else if ((strncmp(name, "ldo", 3) == 0) &&
702 		   (strncmp(name, "ldo4", 4) != 0)) {
703 		mask = LDO_VOLTAGE_MASK;
704 	} else {
705 		return 0;
706 	}
707 
708 	status = stpmic1_register_read(regul->control_reg, &value);
709 	if (status < 0) {
710 		return status;
711 	}
712 
713 	value = (value & mask) >> LDO_BUCK_VOLTAGE_SHIFT;
714 
715 	if (value > regul->voltage_table_size) {
716 		return -ERANGE;
717 	}
718 
719 	return (int)regul->voltage_table[value];
720 }
721 
722 int stpmic1_register_read(uint8_t register_id,  uint8_t *value)
723 {
724 	return stm32_i2c_mem_read(pmic_i2c_handle, pmic_i2c_addr,
725 				  (uint16_t)register_id,
726 				  I2C_MEMADD_SIZE_8BIT, value,
727 				  1, I2C_TIMEOUT_MS);
728 }
729 
730 int stpmic1_register_write(uint8_t register_id, uint8_t value)
731 {
732 	int status;
733 
734 	status = stm32_i2c_mem_write(pmic_i2c_handle, pmic_i2c_addr,
735 				     (uint16_t)register_id,
736 				     I2C_MEMADD_SIZE_8BIT, &value,
737 				     1, I2C_TIMEOUT_MS);
738 
739 #if ENABLE_ASSERTIONS
740 	if (status != 0) {
741 		return status;
742 	}
743 
744 	if ((register_id != WATCHDOG_CONTROL_REG) && (register_id <= 0x40U)) {
745 		uint8_t readval;
746 
747 		status = stpmic1_register_read(register_id, &readval);
748 		if (status != 0) {
749 			return status;
750 		}
751 
752 		if (readval != value) {
753 			return -EIO;
754 		}
755 	}
756 #endif
757 
758 	return status;
759 }
760 
761 int stpmic1_register_update(uint8_t register_id, uint8_t value, uint8_t mask)
762 {
763 	int status;
764 	uint8_t val;
765 
766 	status = stpmic1_register_read(register_id, &val);
767 	if (status != 0) {
768 		return status;
769 	}
770 
771 	val = (val & ~mask) | (value & mask);
772 
773 	return stpmic1_register_write(register_id, val);
774 }
775 
776 void stpmic1_bind_i2c(struct i2c_handle_s *i2c_handle, uint16_t i2c_addr)
777 {
778 	pmic_i2c_handle = i2c_handle;
779 	pmic_i2c_addr = i2c_addr;
780 }
781 
782 void stpmic1_dump_regulators(void)
783 {
784 	uint32_t i;
785 
786 	for (i = 0U; i < MAX_REGUL; i++) {
787 		const char *name __unused = regulators_table[i].dt_node_name;
788 
789 		VERBOSE("PMIC regul %s: %sable, %dmV",
790 			name,
791 			stpmic1_is_regulator_enabled(name) ? "en" : "dis",
792 			stpmic1_regulator_voltage_get(name));
793 	}
794 }
795 
796 int stpmic1_get_version(unsigned long *version)
797 {
798 	uint8_t read_val;
799 	int status;
800 
801 	status = stpmic1_register_read(VERSION_STATUS_REG, &read_val);
802 	if (status < 0) {
803 		return status;
804 	}
805 
806 	*version = (unsigned long)read_val;
807 
808 	return 0;
809 }
810