[PATCH] power: axp: sunxi: configure charge current

Marcin Ślusarz marcin.slusarz at gmail.com
Wed Nov 27 14:04:19 CET 2024


Allows decreasing initial charge current, e.g. when power
supply is too weak to support both charging and other operations.

Signed-off-by: Marcin Ślusarz <mslusarz at renau.com>
Cc: Jagan Teki <jagan at amarulasolutions.com>
Cc: Andre Przywara <andre.przywara at arm.com>
---
 board/sunxi/board.c    |  4 ++++
 drivers/power/Kconfig  |  7 +++++++
 drivers/power/axp221.c | 33 +++++++++++++++++++++++++++++++++
 include/axp221.h       |  3 +++
 include/axp_pmic.h     |  1 +
 5 files changed, 48 insertions(+)

diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index 824c322a0d..07fccf972a 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -623,6 +623,10 @@ void sunxi_board_init(void)
 #if defined CONFIG_AXP809_POWER || defined CONFIG_AXP818_POWER
 	power_failed |= axp_set_sw(IS_ENABLED(CONFIG_AXP_SW_ON));
 #endif
+
+#ifdef CONFIG_AXP221_POWER
+	power_failed |= axp221_set_charge_current(CONFIG_AXP221_CHARGE_CURRENT);
+#endif
 #endif	/* CONFIG_AXPxxx_POWER */
 	printf("DRAM:");
 	gd->ram_size = sunxi_dram_init();
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index 4b81aeb749..06b509a383 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -142,6 +142,13 @@ config SY8106A_POWER
 
 endchoice
 
+config AXP221_CHARGE_CURRENT
+	int "axp221 constant charge current in mA"
+	depends on AXP221_POWER
+	default 1200
+	---help---
+	Any value between 300 and 2100 in 150 increments, or 0 to disable charging.
+
 config AXP_DCDC1_VOLT
 	int "axp pmic dcdc1 voltage"
 	depends on AXP221_POWER || AXP809_POWER || AXP818_POWER
diff --git a/drivers/power/axp221.c b/drivers/power/axp221.c
index c22ca03f46..bf48585da0 100644
--- a/drivers/power/axp221.c
+++ b/drivers/power/axp221.c
@@ -205,6 +205,39 @@ int axp_set_eldo(int eldo_num, unsigned int mvolt)
 				AXP221_OUTPUT_CTRL2_ELDO1_EN << (eldo_num - 1));
 }
 
+static u8 axp221_mamp_to_cfg(int mamp, int min, int max, int div)
+{
+	if (mamp < min)
+		mamp = min;
+	else if (mamp > max)
+		mamp = max;
+
+	return (mamp - min) / div;
+}
+
+int axp221_set_charge_current(unsigned int mamp)
+{
+	int ret;
+	u8 cfg, chrg_ctrl;
+
+	cfg = axp221_mamp_to_cfg(mamp, 300, 2100, 150);
+	if (cfg > 0x0f)
+		return -EINVAL;
+
+	ret = pmic_bus_read(AXP221_CHRG_CTRL1, &chrg_ctrl);
+	if (ret)
+		return ret;
+
+	chrg_ctrl = (chrg_ctrl & 0xf0) | cfg;
+
+	if (mamp == 0)
+		chrg_ctrl &= 0x7f;
+	else
+		chrg_ctrl |= 0x80;
+
+	return pmic_bus_write(AXP221_CHRG_CTRL1, chrg_ctrl);
+}
+
 int axp_init(void)
 {
 	u8 axp_chip_id;
diff --git a/include/axp221.h b/include/axp221.h
index 32b988f3a9..8eb1792435 100644
--- a/include/axp221.h
+++ b/include/axp221.h
@@ -44,6 +44,9 @@
 #define AXP221_ALDO3_CTRL	0x2a
 #define AXP221_SHUTDOWN		0x32
 #define AXP221_SHUTDOWN_POWEROFF	(1 << 7)
+#define AXP221_CHRG_CTRL1	0x33
+#define AXP221_CHRG_CTRL2	0x34
+#define AXP221_CHRG_CTRL3	0x35
 #define AXP221_PAGE		0xff
 
 /* Page 1 addresses */
diff --git a/include/axp_pmic.h b/include/axp_pmic.h
index ae62ef0d76..3bcd8f9ca9 100644
--- a/include/axp_pmic.h
+++ b/include/axp_pmic.h
@@ -52,6 +52,7 @@ int axp_set_aldo4(unsigned int mvolt);
 int axp_set_dldo(int dldo_num, unsigned int mvolt);
 int axp_set_eldo(int eldo_num, unsigned int mvolt);
 int axp_set_fldo(int fldo_num, unsigned int mvolt);
+int axp221_set_charge_current(unsigned int mamp);
 int axp_set_sw(bool on);
 int axp_init(void);
 int axp_get_sid(unsigned int *sid);
-- 
2.25.1



More information about the U-Boot mailing list