]> git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/power/axp152.c
Merge branch 'master' of git://git.denx.de/u-boot-video
[people/ms/u-boot.git] / drivers / power / axp152.c
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 }