xref: /openbmc/u-boot/drivers/power/axp152.c (revision 23ff8633)
1 /*
2  * (C) Copyright 2012
3  * Henrik Nordstrom <henrik@henriknordstrom.net>
4  *
5  * SPDX-License-Identifier:	GPL-2.0+
6  */
7 #include <common.h>
8 #include <asm/arch/pmic_bus.h>
9 #include <axp_pmic.h>
10 
11 static u8 axp152_mvolt_to_target(int mvolt, int min, int max, int div)
12 {
13 	if (mvolt < min)
14 		mvolt = min;
15 	else if (mvolt > max)
16 		mvolt = max;
17 
18 	return (mvolt - min) / div;
19 }
20 
21 int axp_set_dcdc2(unsigned int mvolt)
22 {
23 	int rc;
24 	u8 current, target;
25 
26 	target = axp152_mvolt_to_target(mvolt, 700, 2275, 25);
27 
28 	/* Do we really need to be this gentle? It has built-in voltage slope */
29 	while ((rc = pmic_bus_read(AXP152_DCDC2_VOLTAGE, &current)) == 0 &&
30 	       current != target) {
31 		if (current < target)
32 			current++;
33 		else
34 			current--;
35 		rc = pmic_bus_write(AXP152_DCDC2_VOLTAGE, current);
36 		if (rc)
37 			break;
38 	}
39 	return rc;
40 }
41 
42 int axp_set_dcdc3(unsigned int mvolt)
43 {
44 	u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 50);
45 
46 	return pmic_bus_write(AXP152_DCDC3_VOLTAGE, target);
47 }
48 
49 int axp_set_dcdc4(unsigned int mvolt)
50 {
51 	u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 25);
52 
53 	return pmic_bus_write(AXP152_DCDC4_VOLTAGE, target);
54 }
55 
56 int axp_set_aldo2(unsigned int mvolt)
57 {
58 	u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 100);
59 
60 	return pmic_bus_write(AXP152_LDO2_VOLTAGE, target);
61 }
62 
63 int axp_init(void)
64 {
65 	u8 ver;
66 	int rc;
67 
68 	rc = pmic_bus_init();
69 	if (rc)
70 		return rc;
71 
72 	rc = pmic_bus_read(AXP152_CHIP_VERSION, &ver);
73 	if (rc)
74 		return rc;
75 
76 	if (ver != 0x05)
77 		return -1;
78 
79 	return 0;
80 }
81