colibri_imx6: fix video stdout in default environment
[oweals/u-boot.git] / drivers / power / axp152.c
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
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 -EINVAL;
78
79         return 0;
80 }
81
82 int do_poweroff(struct cmd_tbl *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 }