]> Git Repo - J-u-boot.git/blame - drivers/power/axp221.c
net: mediatek: fix gmac2 usability for mt7629
[J-u-boot.git] / drivers / power / axp221.c
CommitLineData
83d290c5 1// SPDX-License-Identifier: GPL-2.0+
5c7f10fd 2/*
bdcdf846
HG
3 * AXP221 and AXP223 driver
4 *
5 * IMPORTANT when making changes to this file check that the registers
6 * used are the same for the axp221 and axp223.
7 *
8 * (C) Copyright 2014 Hans de Goede <[email protected]>
5c7f10fd 9 * (C) Copyright 2013 Oliver Schinagl <[email protected]>
5c7f10fd
OS
10 */
11
fe4b71b2 12#include <command.h>
5c7f10fd 13#include <errno.h>
1d624a4f 14#include <asm/arch/pmic_bus.h>
6944aff1 15#include <axp_pmic.h>
5c7f10fd
OS
16
17static u8 axp221_mvolt_to_cfg(int mvolt, int min, int max, int div)
18{
19 if (mvolt < min)
20 mvolt = min;
21 else if (mvolt > max)
22 mvolt = max;
23
24 return (mvolt - min) / div;
25}
26
6944aff1 27int axp_set_dcdc1(unsigned int mvolt)
5c7f10fd
OS
28{
29 int ret;
30 u8 cfg = axp221_mvolt_to_cfg(mvolt, 1600, 3400, 100);
31
50e0d5e6 32 if (mvolt == 0)
1d624a4f
HG
33 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1,
34 AXP221_OUTPUT_CTRL1_DCDC1_EN);
50e0d5e6 35
bdcdf846 36 ret = pmic_bus_write(AXP221_DCDC1_CTRL, cfg);
5c7f10fd
OS
37 if (ret)
38 return ret;
39
1d624a4f
HG
40 ret = pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
41 AXP221_OUTPUT_CTRL2_DCDC1SW_EN);
50e0d5e6
HG
42 if (ret)
43 return ret;
44
1d624a4f
HG
45 return pmic_bus_setbits(AXP221_OUTPUT_CTRL1,
46 AXP221_OUTPUT_CTRL1_DCDC1_EN);
5c7f10fd
OS
47}
48
6944aff1 49int axp_set_dcdc2(unsigned int mvolt)
5c7f10fd 50{
50e0d5e6 51 int ret;
5c7f10fd
OS
52 u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1540, 20);
53
50e0d5e6 54 if (mvolt == 0)
1d624a4f
HG
55 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1,
56 AXP221_OUTPUT_CTRL1_DCDC2_EN);
50e0d5e6
HG
57
58 ret = pmic_bus_write(AXP221_DCDC2_CTRL, cfg);
59 if (ret)
60 return ret;
61
1d624a4f
HG
62 return pmic_bus_setbits(AXP221_OUTPUT_CTRL1,
63 AXP221_OUTPUT_CTRL1_DCDC2_EN);
5c7f10fd
OS
64}
65
6944aff1 66int axp_set_dcdc3(unsigned int mvolt)
5c7f10fd 67{
50e0d5e6 68 int ret;
5c7f10fd
OS
69 u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1860, 20);
70
50e0d5e6 71 if (mvolt == 0)
1d624a4f
HG
72 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1,
73 AXP221_OUTPUT_CTRL1_DCDC3_EN);
50e0d5e6
HG
74
75 ret = pmic_bus_write(AXP221_DCDC3_CTRL, cfg);
76 if (ret)
77 return ret;
78
1d624a4f
HG
79 return pmic_bus_setbits(AXP221_OUTPUT_CTRL1,
80 AXP221_OUTPUT_CTRL1_DCDC3_EN);
5c7f10fd
OS
81}
82
6944aff1 83int axp_set_dcdc4(unsigned int mvolt)
5c7f10fd 84{
50e0d5e6 85 int ret;
5c7f10fd
OS
86 u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1540, 20);
87
50e0d5e6 88 if (mvolt == 0)
1d624a4f
HG
89 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1,
90 AXP221_OUTPUT_CTRL1_DCDC4_EN);
50e0d5e6
HG
91
92 ret = pmic_bus_write(AXP221_DCDC4_CTRL, cfg);
93 if (ret)
94 return ret;
95
1d624a4f
HG
96 return pmic_bus_setbits(AXP221_OUTPUT_CTRL1,
97 AXP221_OUTPUT_CTRL1_DCDC4_EN);
5c7f10fd
OS
98}
99
6944aff1 100int axp_set_dcdc5(unsigned int mvolt)
5c7f10fd 101{
50e0d5e6 102 int ret;
5c7f10fd
OS
103 u8 cfg = axp221_mvolt_to_cfg(mvolt, 1000, 2550, 50);
104
50e0d5e6 105 if (mvolt == 0)
1d624a4f
HG
106 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1,
107 AXP221_OUTPUT_CTRL1_DCDC5_EN);
50e0d5e6
HG
108
109 ret = pmic_bus_write(AXP221_DCDC5_CTRL, cfg);
110 if (ret)
111 return ret;
112
1d624a4f
HG
113 return pmic_bus_setbits(AXP221_OUTPUT_CTRL1,
114 AXP221_OUTPUT_CTRL1_DCDC5_EN);
5c7f10fd
OS
115}
116
6944aff1 117int axp_set_aldo1(unsigned int mvolt)
5c7f10fd
OS
118{
119 int ret;
120 u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
121
50e0d5e6 122 if (mvolt == 0)
1d624a4f
HG
123 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1,
124 AXP221_OUTPUT_CTRL1_ALDO1_EN);
50e0d5e6 125
bdcdf846 126 ret = pmic_bus_write(AXP221_ALDO1_CTRL, cfg);
5c7f10fd
OS
127 if (ret)
128 return ret;
129
1d624a4f
HG
130 return pmic_bus_setbits(AXP221_OUTPUT_CTRL1,
131 AXP221_OUTPUT_CTRL1_ALDO1_EN);
5c7f10fd
OS
132}
133
6944aff1 134int axp_set_aldo2(unsigned int mvolt)
5c7f10fd
OS
135{
136 int ret;
137 u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
138
50e0d5e6 139 if (mvolt == 0)
1d624a4f
HG
140 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1,
141 AXP221_OUTPUT_CTRL1_ALDO2_EN);
50e0d5e6 142
bdcdf846 143 ret = pmic_bus_write(AXP221_ALDO2_CTRL, cfg);
5c7f10fd
OS
144 if (ret)
145 return ret;
146
1d624a4f
HG
147 return pmic_bus_setbits(AXP221_OUTPUT_CTRL1,
148 AXP221_OUTPUT_CTRL1_ALDO2_EN);
5c7f10fd
OS
149}
150
6944aff1 151int axp_set_aldo3(unsigned int mvolt)
5c7f10fd
OS
152{
153 int ret;
154 u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
155
50e0d5e6 156 if (mvolt == 0)
1d624a4f
HG
157 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL3,
158 AXP221_OUTPUT_CTRL3_ALDO3_EN);
50e0d5e6 159
bdcdf846 160 ret = pmic_bus_write(AXP221_ALDO3_CTRL, cfg);
5c7f10fd
OS
161 if (ret)
162 return ret;
163
1d624a4f
HG
164 return pmic_bus_setbits(AXP221_OUTPUT_CTRL3,
165 AXP221_OUTPUT_CTRL3_ALDO3_EN);
5c7f10fd
OS
166}
167
3517a27d
CYT
168int axp_set_dldo(int dldo_num, unsigned int mvolt)
169{
170 u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
171 int ret;
172
173 if (dldo_num < 1 || dldo_num > 4)
174 return -EINVAL;
175
176 if (mvolt == 0)
177 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2,
178 AXP221_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
179
180 ret = pmic_bus_write(AXP221_DLDO1_CTRL + (dldo_num - 1), cfg);
181 if (ret)
182 return ret;
183
184 return pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
185 AXP221_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
186}
187
6944aff1 188int axp_set_eldo(int eldo_num, unsigned int mvolt)
6906df1a
SS
189{
190 int ret;
191 u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);
aa23f539
CYT
192
193 if (eldo_num < 1 || eldo_num > 3)
6906df1a 194 return -EINVAL;
6906df1a
SS
195
196 if (mvolt == 0)
aa23f539
CYT
197 return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2,
198 AXP221_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
6906df1a 199
aa23f539 200 ret = pmic_bus_write(AXP221_ELDO1_CTRL + (eldo_num - 1), cfg);
6906df1a
SS
201 if (ret)
202 return ret;
203
aa23f539
CYT
204 return pmic_bus_setbits(AXP221_OUTPUT_CTRL2,
205 AXP221_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
6906df1a
SS
206}
207
6944aff1 208int axp_init(void)
5c7f10fd
OS
209{
210 u8 axp_chip_id;
211 int ret;
212
bdcdf846 213 ret = pmic_bus_init();
5c7f10fd
OS
214 if (ret)
215 return ret;
216
bdcdf846 217 ret = pmic_bus_read(AXP221_CHIP_ID, &axp_chip_id);
5c7f10fd
OS
218 if (ret)
219 return ret;
220
221 if (!(axp_chip_id == 0x6 || axp_chip_id == 0x7 || axp_chip_id == 0x17))
222 return -ENODEV;
223
253e62bf
HG
224 /*
225 * Turn off LDOIO regulators / tri-state GPIO pins, when rebooting
226 * from android these are sometimes on.
227 */
228 ret = pmic_bus_write(AXP_GPIO0_CTRL, AXP_GPIO_CTRL_INPUT);
229 if (ret)
230 return ret;
231
232 ret = pmic_bus_write(AXP_GPIO1_CTRL, AXP_GPIO_CTRL_INPUT);
233 if (ret)
234 return ret;
235
5c7f10fd
OS
236 return 0;
237}
f3fba566 238
6944aff1 239int axp_get_sid(unsigned int *sid)
f3fba566
HG
240{
241 u8 *dest = (u8 *)sid;
242 int i, ret;
243
6944aff1 244 ret = pmic_bus_init();
f3fba566
HG
245 if (ret)
246 return ret;
247
bdcdf846 248 ret = pmic_bus_write(AXP221_PAGE, 1);
f3fba566
HG
249 if (ret)
250 return ret;
251
252 for (i = 0; i < 16; i++) {
bdcdf846 253 ret = pmic_bus_read(AXP221_SID + i, &dest[i]);
f3fba566
HG
254 if (ret)
255 return ret;
256 }
257
bdcdf846 258 pmic_bus_write(AXP221_PAGE, 0);
f3fba566
HG
259
260 for (i = 0; i < 4; i++)
261 sid[i] = be32_to_cpu(sid[i]);
262
263 return 0;
264}
fe4b71b2 265
830e161e 266#if !IS_ENABLED(CONFIG_SYSRESET_CMD_POWEROFF)
09140113 267int do_poweroff(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
fe4b71b2
HG
268{
269 pmic_bus_write(AXP221_SHUTDOWN, AXP221_SHUTDOWN_POWEROFF);
270
271 /* infinite loop during shutdown */
272 while (1) {}
273
274 /* not reached */
275 return 0;
276}
830e161e 277#endif
This page took 0.43184 seconds and 4 git commands to generate.