From 3e07630e1b1e42f96beb4a134eb1b0327b4ed92b Mon Sep 17 00:00:00 2001 From: Merlijn Wajer Date: Fri, 13 Apr 2018 22:32:04 +0200 Subject: [PATCH] Some boards feature a capacitance on LDO3's output that is to large, causing inrush currents which as a result, shut down the AXP209. This has been reported before, without knowing the actual cause. A fix appeared to be done with commit 0e6e34ac8db ("sunxi: Olimex A20 boards: Enable LDO3 and LDO4 regulators"). The description there is a bit misleading, the kernel does not hang during AXP209 initialization, the PMIC shuts down, causing voltages to drop and thus the whole system to freeze. While the AXP209 does have the ability to ramp up the voltage slowly, to reduce these inrush currents, the voltage rate control (VRC) however is not applicable when switching on the LDO3 output. Only when going from an enabled lower voltage setting, to a higher voltage setting is the VRC in effect. To work around this problem, we set LDO3 to the lowest possible setting of 0.7 V if it was not yet enabled, and then let the VRC (if enabled) do its thing. It should be noted, that for some undocumented reason, there is a short delay needed between setting the LDO3 voltage register and enabling the power. One would expect that this delay ought to be just after enabling the output power at 0.7 V, but this did not work. --- drivers/power/Kconfig | 9 +++++++++ drivers/power/axp209.c | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 4d84115..7d10d39 100644 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig @@ -230,6 +230,15 @@ config AXP_ALDO3_VOLT_SLOPE_08 endchoice +config AXP_ALDO3_INRUSH_QUIRK + bool "axp pmic (a)ldo3 inrush quirk" + depends on AXP209_POWER + default n + ---help--- + The reference design denotes a value of 4.7 uF for the output capacitor + of LDO3. Some boards have to higher capacitance than that which causes + an inrush current and causes an AXP209 shutdown. + config AXP_ALDO4_VOLT int "axp pmic (a)ldo4 voltage" depends on AXP209_POWER diff --git a/drivers/power/axp209.c b/drivers/power/axp209.c index 8a4b188..4c983d5 100644 --- a/drivers/power/axp209.c +++ b/drivers/power/axp209.c @@ -122,6 +122,28 @@ int axp_set_aldo3(unsigned int mvolt) if (rc) return rc; + /* + * On some boards, LDO3 has a to big capacitor installed. When + * turning on LDO3, this causes the AXP209 to shutdown on + * voltages over 1.9 volt. As a work around, we enable LDO3 + * first with the lowest possible voltage. If this still causes + * high inrush currents, the voltage slope should be increased. + */ +#ifdef CONFIG_AXP_ALDO3_INRUSH_QUIRK + rc = pmic_bus_read(AXP209_OUTPUT_CTRL, &cfg); + if (rc) + return rc; + + if (!(cfg & AXP209_OUTPUT_CTRL_LDO3)) { + rc = pmic_bus_write(AXP209_LDO3_VOLTAGE, 0x0); /* 0.7 Volt */ + mdelay(1); + rc |= pmic_bus_setbits(AXP209_OUTPUT_CTRL, AXP209_OUTPUT_CTRL_LDO3); + + if (rc) + return rc; + } +#endif + if (mvolt == -1) cfg = AXP209_LDO3_VOLTAGE_FROM_LDO3IN; else