| From 9a5d5c3c8f70f66eb2ea39093b78e70710833a85 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 8 Feb 2022 13:51:47 +0100 |
| Subject: power: supply: axp288-charger: Set Vhold to 4.4V |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| [ Upstream commit 5ac121b81b4051e7fc83d5b3456a5e499d5bd147 ] |
| |
| The AXP288's recommended and factory default Vhold value (minimum |
| input voltage below which the input current draw will be reduced) |
| is 4.4V. This lines up with other charger IC's such as the TI |
| bq2419x/bq2429x series which use 4.36V or 4.44V. |
| |
| For some reason some BIOS-es initialize Vhold to 4.6V or even 4.7V |
| which combined with the typical voltage drop over typically low |
| wire gauge micro-USB cables leads to the input-current getting |
| capped below 1A (with a 2A capable dedicated charger) based on Vhold. |
| |
| This leads to slow charging, or even to the device slowly discharging |
| if the device is in heavy use. |
| |
| As the Linux AXP288 drivers use the builtin BC1.2 charger detection |
| and send the input-current-limit according to the detected charger |
| there really is no reason not to use the recommended 4.4V Vhold. |
| |
| Set Vhold to 4.4V to fix the slow charging issue on various devices. |
| |
| There is one exception, the special-case of the HP X2 2-in-1s which |
| combine this BC1.2 capable PMIC with a Type-C port and a 5V/3A factory |
| provided charger with a Type-C plug which does not do BC1.2. These |
| have their input-current-limit hardcoded to 3A (like under Windows) |
| and use a higher Vhold on purpose to limit the current when used |
| with other chargers. To avoid touching Vhold on these HP X2 laptops |
| the code setting Vhold is added to an else branch of the if checking |
| for these models. |
| |
| Note this also fixes the sofar unused VBUS_ISPOUT_VHOLD_SET_MASK |
| define, which was wrong. |
| |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/power/supply/axp288_charger.c | 14 ++++++++++++-- |
| 1 file changed, 12 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/power/supply/axp288_charger.c b/drivers/power/supply/axp288_charger.c |
| index ec41f6cd3f93..c498e62ab4e2 100644 |
| --- a/drivers/power/supply/axp288_charger.c |
| +++ b/drivers/power/supply/axp288_charger.c |
| @@ -42,11 +42,11 @@ |
| #define VBUS_ISPOUT_CUR_LIM_1500MA 0x1 /* 1500mA */ |
| #define VBUS_ISPOUT_CUR_LIM_2000MA 0x2 /* 2000mA */ |
| #define VBUS_ISPOUT_CUR_NO_LIM 0x3 /* 2500mA */ |
| -#define VBUS_ISPOUT_VHOLD_SET_MASK 0x31 |
| +#define VBUS_ISPOUT_VHOLD_SET_MASK 0x38 |
| #define VBUS_ISPOUT_VHOLD_SET_BIT_POS 0x3 |
| #define VBUS_ISPOUT_VHOLD_SET_OFFSET 4000 /* 4000mV */ |
| #define VBUS_ISPOUT_VHOLD_SET_LSB_RES 100 /* 100mV */ |
| -#define VBUS_ISPOUT_VHOLD_SET_4300MV 0x3 /* 4300mV */ |
| +#define VBUS_ISPOUT_VHOLD_SET_4400MV 0x4 /* 4400mV */ |
| #define VBUS_ISPOUT_VBUS_PATH_DIS BIT(7) |
| |
| #define CHRG_CCCV_CC_MASK 0xf /* 4 bits */ |
| @@ -769,6 +769,16 @@ static int charger_init_hw_regs(struct axp288_chrg_info *info) |
| ret = axp288_charger_vbus_path_select(info, true); |
| if (ret < 0) |
| return ret; |
| + } else { |
| + /* Set Vhold to the factory default / recommended 4.4V */ |
| + val = VBUS_ISPOUT_VHOLD_SET_4400MV << VBUS_ISPOUT_VHOLD_SET_BIT_POS; |
| + ret = regmap_update_bits(info->regmap, AXP20X_VBUS_IPSOUT_MGMT, |
| + VBUS_ISPOUT_VHOLD_SET_MASK, val); |
| + if (ret < 0) { |
| + dev_err(&info->pdev->dev, "register(%x) write error(%d)\n", |
| + AXP20X_VBUS_IPSOUT_MGMT, ret); |
| + return ret; |
| + } |
| } |
| |
| /* Read current charge voltage and current limit */ |
| -- |
| 2.35.1 |
| |