1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * (C) Copyright 2012
4 * Henrik Nordstrom <henrik@henriknordstrom.net>
5 */
6 #include <common.h>
7 #include <command.h>
8 #include <asm/arch/pmic_bus.h>
9 #include <axp_pmic.h>
10
axp152_mvolt_to_target(int mvolt,int min,int max,int div)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
axp_set_dcdc2(unsigned int mvolt)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, ¤t)) == 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
axp_set_dcdc3(unsigned int mvolt)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
axp_set_dcdc4(unsigned int mvolt)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
axp_set_aldo2(unsigned int mvolt)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
axp_init(void)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 -EINVAL;
78
79 return 0;
80 }
81
do_poweroff(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])82 int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
83 {
84 pmic_bus_write(AXP152_SHUTDOWN, AXP152_POWEROFF);
85
86 /* infinite loop during shutdown */
87 while (1) {}
88
89 /* not reached */
90 return 0;
91 }
92