1 // SPDX-License-Identifier: GPL-2.0+
3 * AXP809 driver based on AXP221 driver
15 #include <asm/arch/pmic_bus.h>
18 static u8 axp809_mvolt_to_cfg(int mvolt, int min, int max, int div)
25 return (mvolt - min) / div;
28 int axp_set_dcdc1(unsigned int mvolt)
31 u8 cfg = axp809_mvolt_to_cfg(mvolt, 1600, 3400, 100);
34 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL1,
35 AXP809_OUTPUT_CTRL1_DCDC1_EN);
37 ret = pmic_bus_write(AXP809_DCDC1_CTRL, cfg);
41 ret = pmic_bus_setbits(AXP809_OUTPUT_CTRL2,
42 AXP809_OUTPUT_CTRL2_DC1SW_EN);
46 return pmic_bus_setbits(AXP809_OUTPUT_CTRL1,
47 AXP809_OUTPUT_CTRL1_DCDC1_EN);
50 int axp_set_dcdc2(unsigned int mvolt)
53 u8 cfg = axp809_mvolt_to_cfg(mvolt, 600, 1540, 20);
56 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL1,
57 AXP809_OUTPUT_CTRL1_DCDC2_EN);
59 ret = pmic_bus_write(AXP809_DCDC2_CTRL, cfg);
63 return pmic_bus_setbits(AXP809_OUTPUT_CTRL1,
64 AXP809_OUTPUT_CTRL1_DCDC2_EN);
67 int axp_set_dcdc3(unsigned int mvolt)
70 u8 cfg = axp809_mvolt_to_cfg(mvolt, 600, 1860, 20);
73 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL1,
74 AXP809_OUTPUT_CTRL1_DCDC3_EN);
76 ret = pmic_bus_write(AXP809_DCDC3_CTRL, cfg);
80 return pmic_bus_setbits(AXP809_OUTPUT_CTRL1,
81 AXP809_OUTPUT_CTRL1_DCDC3_EN);
84 int axp_set_dcdc4(unsigned int mvolt)
87 u8 cfg = axp809_mvolt_to_cfg(mvolt, 600, 1540, 20);
90 cfg = 0x30 + axp809_mvolt_to_cfg(mvolt, 1800, 2600, 100);
93 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL1,
94 AXP809_OUTPUT_CTRL1_DCDC4_EN);
96 ret = pmic_bus_write(AXP809_DCDC4_CTRL, cfg);
100 return pmic_bus_setbits(AXP809_OUTPUT_CTRL1,
101 AXP809_OUTPUT_CTRL1_DCDC4_EN);
104 int axp_set_dcdc5(unsigned int mvolt)
107 u8 cfg = axp809_mvolt_to_cfg(mvolt, 1000, 2550, 50);
110 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL1,
111 AXP809_OUTPUT_CTRL1_DCDC5_EN);
113 ret = pmic_bus_write(AXP809_DCDC5_CTRL, cfg);
117 return pmic_bus_setbits(AXP809_OUTPUT_CTRL1,
118 AXP809_OUTPUT_CTRL1_DCDC5_EN);
121 int axp_set_aldo(int aldo_num, unsigned int mvolt)
126 if (aldo_num < 1 || aldo_num > 3)
129 if (mvolt == 0 && aldo_num == 3)
130 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL2,
131 AXP809_OUTPUT_CTRL2_ALDO3_EN);
133 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL1,
134 AXP809_OUTPUT_CTRL1_ALDO1_EN << (aldo_num - 1));
136 cfg = axp809_mvolt_to_cfg(mvolt, 700, 3300, 100);
137 ret = pmic_bus_write(AXP809_ALDO1_CTRL + (aldo_num - 1), cfg);
142 return pmic_bus_setbits(AXP809_OUTPUT_CTRL2,
143 AXP809_OUTPUT_CTRL2_ALDO3_EN);
144 return pmic_bus_setbits(AXP809_OUTPUT_CTRL1,
145 AXP809_OUTPUT_CTRL1_ALDO1_EN << (aldo_num - 1));
148 /* TODO: re-work other AXP drivers to consolidate ALDO functions. */
149 int axp_set_aldo1(unsigned int mvolt)
151 return axp_set_aldo(1, mvolt);
154 int axp_set_aldo2(unsigned int mvolt)
156 return axp_set_aldo(2, mvolt);
159 int axp_set_aldo3(unsigned int mvolt)
161 return axp_set_aldo(3, mvolt);
164 int axp_set_dldo(int dldo_num, unsigned int mvolt)
166 u8 cfg = axp809_mvolt_to_cfg(mvolt, 700, 3300, 100);
169 if (dldo_num < 1 || dldo_num > 2)
173 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL2,
174 AXP809_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
176 if (dldo_num == 1 && mvolt > 3300)
177 cfg += 1 + axp809_mvolt_to_cfg(mvolt, 3400, 4200, 200);
178 ret = pmic_bus_write(AXP809_DLDO1_CTRL + (dldo_num - 1), cfg);
182 return pmic_bus_setbits(AXP809_OUTPUT_CTRL2,
183 AXP809_OUTPUT_CTRL2_DLDO1_EN << (dldo_num - 1));
186 int axp_set_eldo(int eldo_num, unsigned int mvolt)
189 u8 cfg = axp809_mvolt_to_cfg(mvolt, 700, 3300, 100);
191 if (eldo_num < 1 || eldo_num > 3)
195 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL2,
196 AXP809_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
198 ret = pmic_bus_write(AXP809_ELDO1_CTRL + (eldo_num - 1), cfg);
202 return pmic_bus_setbits(AXP809_OUTPUT_CTRL2,
203 AXP809_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
206 int axp_set_sw(bool on)
209 return pmic_bus_setbits(AXP809_OUTPUT_CTRL2,
210 AXP809_OUTPUT_CTRL2_SWOUT_EN);
212 return pmic_bus_clrbits(AXP809_OUTPUT_CTRL2,
213 AXP809_OUTPUT_CTRL2_SWOUT_EN);
218 return pmic_bus_init();
221 #if !IS_ENABLED(CONFIG_SYSRESET_CMD_POWEROFF)
222 int do_poweroff(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
224 pmic_bus_write(AXP809_SHUTDOWN, AXP809_SHUTDOWN_POWEROFF);
226 /* infinite loop during shutdown */