[PATCH v2 1/2] power: supply: qcom_battmgr: fix the battery current sign on Kaanapali

From: Joonhoe Kim

Date: Thu Nov 12 2026 - 08:51:16 EST


The Kaanapali battery firmware reports the battery current with
discharge positive: on a Lenovo Y700 Gen 5 (TB323FU) current_now reads
-9.1 A while charging and +0.57 A on battery. The power_supply ABI has
charging positive, and upower reports such a charging battery as
discharging.

Other firmware behind the same callback uses the ABI sign [1], so
negate the value only for qcom,kaanapali-pmic-glink.

Fixes: 16a7c32e586e ("power: supply: qcom_battmgr: Add support for Glymur and Kaanapali")
Link: https://lore.kernel.org/all/20260829054546.86210-1-jan.brummer@xxxxxxxxx/ [1]
Signed-off-by: Joonhoe Kim <26rote@xxxxxxxxx>
---
v2: no code change; reworded the device name.

The sign is checked only on the Y700 Gen 5. On v1 Konrad asked Jingyi
to check QRD/MTP; no reply yet:
https://lore.kernel.org/all/0e5b7d2e-e141-4ce4-a873-b65bd9ef3c4a@xxxxxxxxxxxxxxxx/

drivers/power/supply/qcom_battmgr.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/drivers/power/supply/qcom_battmgr.c b/drivers/power/supply/qcom_battmgr.c
index d6e3edbab..58e103e08 100644
--- a/drivers/power/supply/qcom_battmgr.c
+++ b/drivers/power/supply/qcom_battmgr.c
@@ -316,6 +316,7 @@ struct qcom_battmgr {
struct pmic_glink_client *client;

enum qcom_battmgr_variant variant;
+ bool current_inverted;

struct power_supply *ac_psy;
struct power_supply *bat_psy;
@@ -1574,6 +1575,8 @@ static void qcom_battmgr_sm8350_callback(struct qcom_battmgr *battmgr,
break;
case BATT_CURR_NOW:
battmgr->status.current_now = le32_to_cpu(resp->intval.value);
+ if (battmgr->current_inverted)
+ battmgr->status.current_now = -battmgr->status.current_now;
break;
case BATT_TEMP:
val = le32_to_cpu(resp->intval.value);
@@ -1804,6 +1807,9 @@ static int qcom_battmgr_probe(struct auxiliary_device *adev,
else
battmgr->variant = QCOM_BATTMGR_SM8350;

+ battmgr->current_inverted = device_is_compatible(dev->parent,
+ "qcom,kaanapali-pmic-glink");
+
ret = qcom_battmgr_charge_control_thresholds_init(battmgr);
if (ret < 0)
return dev_err_probe(dev, ret,
--
2.53.0