From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster2-host9-snip4-10.eps.apple.com [57.103.68.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1775A30FC1F for ; Mon, 6 Apr 2026 20:58:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509107; cv=none; b=BEqauAHRLkAJ+Q2QjKmqUJQ35SSlYfYl/JApJR3IUIacoMa8mVWooFmPR5IwJdipoDP3z89clmXD8oFW7Zcw0Fgf9a4xWkDsjpSDGqPzUaCCS9aF95dFRdSTL6ONPK8UtUq526FoQwj5rxafrkPba3uJXF1Q9MlQZYrb1GMTxU8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509107; c=relaxed/simple; bh=NIdsf/+UlVU88X02JBQtH6zsr2WPK+T9TiBI1Ds9r+Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=I8WzvVKNB4+SWZg8UZzHcQiqxBebxRk7xS69Z4w7pJNoRHb4JzfUhzRl5Szt+IPLDODnbr0KDeLX50Tf5hhpKsoctgGKoLByfdF0Xt9nU+eYi8Opco4+wPg0wHLU0uMdIubZj6FQiGrt2FuF3ZRZYuyrLlQvymHttO0iGzOmhJ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=LRZwibZ3; arc=none smtp.client-ip=57.103.68.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="LRZwibZ3" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id DD1DA18000B6; Mon, 06 Apr 2026 20:58:22 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509105; x=1778101105; bh=Bkg+YlbK3ciRSIn7lWu7NMbXCeb6k1ioPW3OqWnAHGI=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:x-icloud-hme; b=LRZwibZ3GXHbU2IklG3YzzaDFwgZnTbxsXs8HhJdX9l3ruzdyaYJU0WfUZA8cP1f5XR0W9VkwunFyCZ2guYBwdZB3sSzteJy9PKJpfpfeqWZgtexLI7VMN/MXwizRXlUhmCRtau6rGPW2+J1Zoeb6hmbGIyiEn5kDqAnfPD/7Gx5BDagqZ4gdMyzVJngOc5fmCrEAbFdEA/0uylrCEM0qGkW3SPhQ1gfz002rzZZk/ZWxEPhEl1irLbiaXC8ELfkPVdPDnakXJ5ieEtpohKEVLDKlizQzTBWfy2CtTnXjyepN9oKLEOrsLgALWXOB25rbMseMSysSzYWtpGGwF2j/g== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id 477C0180026C; Mon, 06 Apr 2026 20:58:21 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 1/9] power: supply: max17042_battery: Put LSB units into defines Date: Mon, 6 Apr 2026 16:57:49 -0400 Message-ID: <20260406205759.493288-2-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfXwsH6NEEC2u9y Xl/2REPjc4yz/n2gBoEuDnLyL0wv1tFiMEMmLcnq5szC1etqwq49dX6Qlwukm4Mjb6wuyYuZY4A XefeXnQcR2wxG2Bhv3UIBQEhyg4BRfT4q6efA6sf6Pty1Vmm1+VZtjFDY5PHK+liamMz4nBTPk5 E2oaCatf1ua9bM1n+lX2GIK4VG9pDw/nhS8DRI7DU1Z1QLJgH+82c+HgvpcoKDjbqPvVlARjdUT OeTc0r2HgnoVO+8F8CZv6ylaaWozXhOX63DE+mQqMyDpHzPiidhe98zgYm8vG7o1NeroqEMeSfK v+o9YdrVomAHIUhpekzbXlKbKGmT/QEUYRJh49UOZ3Zz7enmYeokhN2aUEV6vQ= X-Proofpoint-ORIG-GUID: DVcIh8YDvTTHGuzTgdrOiYIWQMQas62t X-Proofpoint-GUID: DVcIh8YDvTTHGuzTgdrOiYIWQMQas62t X-Authority-Info-Out: v=2.4 cv=HYgZjyE8 c=1 sm=1 tr=0 ts=69d41e6f cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=W7wRznvd8wUDW1vWsjEA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 malwarescore=0 mlxscore=0 clxscore=1015 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 spamscore=0 phishscore=0 adultscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 From: Sebastian Krzyszkowiak Signed-off-by: Sebastian Krzyszkowiak --- drivers/power/supply/max17042_battery.c | 36 ++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index acea176101fa..a6798b9a1c82 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -52,6 +52,13 @@ =20 #define MAX17042_VMAX_TOLERANCE 50 /* 50 mV */ =20 +#define MAX17042_CURRENT_LSB 1562500ll /* 1.5625=C2=B5V/Rsense */ +#define MAX17042_CAPACITY_LSB 5000000ll /* 5.0=C2=B5VH/Rsense */ +#define MAX17042_TIME_LSB 5625 / 1000 /* s */ +#define MAX17042_VOLTAGE_LSB 625 / 8 /* =C2=B5V */ +#define MAX17042_RESISTANCE_LSB 1 / 4096 /* =CE=A9 */ +#define MAX17042_TEMPERATURE_LSB 1 / 256 /* =C2=B0C */ + struct max17042_chip { struct device *dev; struct regmap *regmap; @@ -105,8 +112,7 @@ static int max17042_get_temperature(struct max17042_chi= p *chip, int *temp) =20 *temp =3D sign_extend32(data, 15); /* The value is converted into deci-centigrade scale */ - /* Units of LSB =3D 1 / 256 degree Celsius */ - *temp =3D *temp * 10 / 256; + *temp =3D *temp * 10 * MAX17042_TEMPERATURE_LSB; return 0; } =20 @@ -183,7 +189,7 @@ static int max17042_get_battery_health(struct max17042_= chip *chip, int *health) goto health_error; =20 /* bits [0-3] unused */ - vavg =3D val * 625 / 8; + vavg =3D val * MAX17042_VOLTAGE_LSB; /* Convert to millivolts */ vavg /=3D 1000; =20 @@ -192,7 +198,7 @@ static int max17042_get_battery_health(struct max17042_= chip *chip, int *health) goto health_error; =20 /* bits [0-3] unused */ - vbatt =3D val * 625 / 8; + vbatt =3D val * MAX17042_VOLTAGE_LSB; /* Convert to millivolts */ vbatt /=3D 1000; =20 @@ -299,21 +305,21 @@ static int max17042_get_property(struct power_supply = *psy, if (ret < 0) return ret; =20 - val->intval =3D data * 625 / 8; + val->intval =3D data * MAX17042_VOLTAGE_LSB; break; case POWER_SUPPLY_PROP_VOLTAGE_AVG: ret =3D regmap_read(map, MAX17042_AvgVCELL, &data); if (ret < 0) return ret; =20 - val->intval =3D data * 625 / 8; + val->intval =3D data * MAX17042_VOLTAGE_LSB; break; case POWER_SUPPLY_PROP_VOLTAGE_OCV: ret =3D regmap_read(map, MAX17042_OCVInternal, &data); if (ret < 0) return ret; =20 - val->intval =3D data * 625 / 8; + val->intval =3D data * MAX17042_VOLTAGE_LSB; break; case POWER_SUPPLY_PROP_CAPACITY: if (chip->pdata->enable_current_sense) @@ -330,7 +336,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - data64 =3D data * 5000000ll; + data64 =3D data * MAX17042_CAPACITY_LSB; do_div(data64, chip->pdata->r_sns); val->intval =3D data64; break; @@ -339,7 +345,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - data64 =3D data * 5000000ll; + data64 =3D data * MAX17042_CAPACITY_LSB; do_div(data64, chip->pdata->r_sns); val->intval =3D data64; break; @@ -348,7 +354,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - data64 =3D data * 5000000ll; + data64 =3D data * MAX17042_CAPACITY_LSB; do_div(data64, chip->pdata->r_sns); val->intval =3D data64; break; @@ -357,7 +363,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - data64 =3D sign_extend64(data, 15) * 5000000ll; + data64 =3D sign_extend64(data, 15) * MAX17042_CAPACITY_LSB; val->intval =3D div_s64(data64, chip->pdata->r_sns); break; case POWER_SUPPLY_PROP_TEMP: @@ -399,7 +405,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - data64 =3D sign_extend64(data, 15) * 1562500ll; + data64 =3D sign_extend64(data, 15) * MAX17042_CURRENT_LSB; val->intval =3D div_s64(data64, chip->pdata->r_sns); } else { return -EINVAL; @@ -411,7 +417,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - data64 =3D sign_extend64(data, 15) * 1562500ll; + data64 =3D sign_extend64(data, 15) * MAX17042_CURRENT_LSB; val->intval =3D div_s64(data64, chip->pdata->r_sns); } else { return -EINVAL; @@ -422,7 +428,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - data64 =3D data * 1562500ll; + data64 =3D data * MAX17042_CURRENT_LSB; val->intval =3D div_s64(data64, chip->pdata->r_sns); break; case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: @@ -430,7 +436,7 @@ static int max17042_get_property(struct power_supply *p= sy, if (ret < 0) return ret; =20 - val->intval =3D data * 5625 / 1000; + val->intval =3D data * MAX17042_TIME_LSB; break; default: return -EINVAL; --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster2-host6-snip4-7.eps.apple.com [57.103.68.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85A061EF09B for ; Mon, 6 Apr 2026 20:58:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.240 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509107; cv=none; b=oROpqQv2jsVhQhBgC9o3puF4CMxh+RXyHOAc9HitI/dQDT2EaF8f9y7x/NPEp53GnvB+MnfFNWVA1KeF4dE0ncqYjmX3QQjbmXDGmg8KUrV8N+V4LOllvyIF9fgnGUIa3Xfa61W3sYVRyUDFcKvUK8Bjx0NB5rMvAHkilrlRiB0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509107; c=relaxed/simple; bh=myHEVijARbnp7nRMm+XiWNLpo5RW3o/BWlvp3zvsJz8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ea2DJVoTFpu9TcVctxPUe/5Pm4Wp5a0JL0P7U2y8KWG6ChT57SqgMW0yT+wSPDNwzUhw/80T1J+A9eY2zkFm9DQqLnl2c5f0WUaWmWezD7/7S57XkYEMXiLBdGHDlaTtDWRO+rUJbxR5wBOoPaUxw00ZnaRyn2BexIK7ZGxTd7I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=tgO1MKKw; arc=none smtp.client-ip=57.103.68.240 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="tgO1MKKw" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 9C5E01800136; Mon, 06 Apr 2026 20:58:25 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509106; x=1778101106; bh=BCnkB98xRcAiOAj3NRuaa+fDwY+UZhu1uE7YhN9ZvhU=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=tgO1MKKwO5Kbcs5v+cPtyQffClswmXAmkqEjgH7CJfJqT+1AY0BmEG/NT9txscxQVa5AYlGRD8Zgh5XMWYRulUVEJJJH54PXVH+6XnJlUqI1ZqTSerREYPcaDc022lBZqPuDhlHrHCCR6JXofLVIXhuUzAkDbBUWOosB3Oc4HeBnsTlX6EvmZh/i7AbXhH3BeRvpfgtO+NYSnVafwrhrxTNLrN6rg3oebHcVYtwYNAde0QNIrVD0XQ+JSpQVNvjDu32eaSQlZuhcv5+N+OJRlmcOoyaX1qHSpYlcospzjsrHbYBLMQgbjLDgV7HP8v/j4MpFzTIFUR8NGk8xwtGp6g== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id 8E9C9180024D; Mon, 06 Apr 2026 20:58:24 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 2/9] power: supply: max17042_battery: Use Current register in get_status Date: Mon, 6 Apr 2026 16:57:50 -0400 Message-ID: <20260406205759.493288-3-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=afdsXBot c=1 sm=1 tr=0 ts=69d41e71 cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=2ivLaHuQe1mDuBazr-gA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfX6ioobDb9VplX Ksgr7jbJXWhKpfNDmRYWIFM8ipSccMAl3BjwlY5TdO4hmiIiU/RVtokQmClo5fFpM/Kgbs4GkMA fR7nMvcBXGQ6RybGndJYpIdXXTdGBj+rEyLEYYXy0g8nBpwMWwaSct7OEuFzrCwUbSJWPz6ZVvg AUmITnGHH64hHVLLcjijx9XIHXyaa5htPgMKDjrOjELM6tLf6dIZs/zQJWgP4rzh/0kg/N8AOVI eq3g8G38uIpgfFgdBaQbGyndJ+4dI15Z3CtZebwBApCTEfxONxDv7eDVvTzu6CRmfthd8h/7dAy vdRuxef+73rEYxrlTtLMwZpnjbjhS099MZNu4DeC5Sv1IwAaO2EsZjW9Bv6CvE= X-Proofpoint-GUID: xJFKb-wfqMqjVlMPbsNJO2kqmXBE3boa X-Proofpoint-ORIG-GUID: xJFKb-wfqMqjVlMPbsNJO2kqmXBE3boa X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 malwarescore=0 phishscore=0 mlxlogscore=999 bulkscore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 suspectscore=0 mlxscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 Content-Type: text/plain; charset="utf-8" From: Sebastian Krzyszkowiak It can take a while for AvgCurrent to adjust after (un)plugging the charger= . Use the instantaneous value in order to not confuse the userspace. While at that, don't do unit conversion of the read value. The current code= was prone to overflows and we only care about the sign anyway. Signed-off-by: Sebastian Krzyszkowiak --- drivers/power/supply/max17042_battery.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index a6798b9a1c82..ddeba965ab5b 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -119,7 +119,7 @@ static int max17042_get_temperature(struct max17042_chi= p *chip, int *temp) static int max17042_get_status(struct max17042_chip *chip, int *status) { int ret, charge_full, charge_now; - int avg_current; + int current_now; u32 data; =20 ret =3D power_supply_am_i_supplied(chip->battery); @@ -164,14 +164,13 @@ static int max17042_get_status(struct max17042_chip *= chip, int *status) return 0; } =20 - ret =3D regmap_read(chip->regmap, MAX17042_AvgCurrent, &data); + ret =3D regmap_read(chip->regmap, MAX17042_Current, &data); if (ret < 0) return ret; =20 - avg_current =3D sign_extend32(data, 15); - avg_current *=3D 1562500 / chip->pdata->r_sns; + current_now =3D sign_extend32(data, 15); =20 - if (avg_current > 0) + if (current_now > 0) *status =3D POWER_SUPPLY_STATUS_CHARGING; else *status =3D POWER_SUPPLY_STATUS_DISCHARGING; --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster1-host2-snip4-1.eps.apple.com [57.103.68.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 18BF238C2BE for ; Mon, 6 Apr 2026 20:58:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.14 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509111; cv=none; b=avPYwIofw7g0qrql71beGINvPdZhewzfpqn/gmoYT8giqna8KH4MZhqFSKE0b5cSFUMnsXquaSz8AHAJIiFNU1WhoYBZjTS7l+2PjSZUvVQEoWvAb1arMTE7RWvaAh1/SRXs3BZ3XbUiYjz3u8NcCKl2Vix64Rdiqkpwq5cZWus= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509111; c=relaxed/simple; bh=AMwD/10VTif1hBkjtQDXDlZCtGa6RGHKMnn71rMDUIo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CGbbU4YL06ZbnVLk4SJ6m2Bww4L4F9hi75Fiuz2B0Z8w3KktejRoY9shMAwrz32ixRo2x03x7blLTYWN8mQS5tvKvXa8+mHCOR1UppGC8PCHoqWWkGvLeQpGklpV71MLo5EIMUDyLPKoPSmM1qqG+zSxt7eexy7KGC41cd2pbOk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=Fhg+DyQZ; arc=none smtp.client-ip=57.103.68.14 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="Fhg+DyQZ" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 86477180011C; Mon, 06 Apr 2026 20:58:28 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509109; x=1778101109; bh=B+trGXuzsBi7BBdRkup+Lr8u2oDGSvuTlLJj7Z/MTN8=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=Fhg+DyQZjlTPCR+w0aiJSqvEXgasyr5T4YtKwc8wOAXqhGi48lusBKUcxPIq11gMVcC8OWfCRY7oijMnwKA/06nrQYJE/Oa+gkWEAfzQRPQk5uXHB1N34kBKaeKtp/UNpjy+vPuMvhX2wK24EEHhPaiTh5tko7wvw7q7rCuLdPdR5j5H/QkTnpArcCtSd4fls2ra2Eh0sutKYTuZtLol62nKNSdtPlPikBsx5wU2Lyqc2W71lwMUzuwjNeSj4b854VhjIzhRk03gan6shYMM/wbVROZij9PIYxCJrG2TWVTjobgc4StqeCpD2PiSCbBNLaNnpit7TszI6xWRLjUGJA== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id 4EF69180027B; Mon, 06 Apr 2026 20:58:27 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Cloutier Subject: [PATCH v1 3/9] power: supply: max17042_battery: Use dev_err_probe for power supply registration Date: Mon, 6 Apr 2026 16:57:51 -0400 Message-ID: <20260406205759.493288-4-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: Hxi6cmDWxZniVpjJd42kVfpN-5NKNyAO X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfXxpj8pVchhZ0C GY4GZW6p+tYgy6Wk1i7n/CaHK07EoNcSj9ETrqSpf4MpC5NPTU/Xd4xvB6P831qrXL1ugL7Y64J Bg8MbVa7iJsFg3OaUXkIv4crdQq8zesSx6s8efq05L/YEhgkXM247sV3IV/Ye8JDt5O7g4H2OS3 6cy+z3+XUAeFw/w7IyvgLC33lESQgMSAW5dYQZfpgIs+vzvya/DecnOAB0jxoXBeUUDxzTvSkmo UH2kB0emQoHGFInjw+giXMRxy46bld3YYhHmIstuRHYJnf82TT/FIxZwQvRVNuZ7Lz81oilfutQ E0UvBvPhsIRFTAbuAdQWquNJM7DKJjTrpq0JMqhzpIT2IEfE8m6/Xqkxcs7T7o= X-Authority-Info-Out: v=2.4 cv=BaDVE7t2 c=1 sm=1 tr=0 ts=69d41e74 cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=9e34aSz6kEOh0L3mk08A:9 X-Proofpoint-GUID: Hxi6cmDWxZniVpjJd42kVfpN-5NKNyAO X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 lowpriorityscore=0 spamscore=0 adultscore=0 mlxscore=0 malwarescore=0 suspectscore=0 bulkscore=0 clxscore=1015 phishscore=0 mlxlogscore=999 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 Content-Type: text/plain; charset="utf-8" From: Vincent Cloutier Use dev_err_probe() for power-supply registration failures so deferred prob= e does not spam the log and the original error code is preserved. Signed-off-by: Vincent Cloutier --- drivers/power/supply/max17042_battery.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index ddeba965ab5b..31007ba122e5 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -1095,10 +1095,9 @@ static int max17042_probe(struct i2c_client *client,= struct device *dev, int irq =20 chip->battery =3D devm_power_supply_register(dev, max17042_desc, &psy_cfg); - if (IS_ERR(chip->battery)) { - dev_err(dev, "failed: power supply register\n"); - return PTR_ERR(chip->battery); - } + if (IS_ERR(chip->battery)) + return dev_err_probe(dev, PTR_ERR(chip->battery), + "failed: power supply register\n"); =20 if (irq) { unsigned int flags =3D IRQF_ONESHOT | IRQF_SHARED | IRQF_PROBE_SHARED; --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster1-host6-snip4-10.eps.apple.com [57.103.68.63]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DEDE130FC1F for ; Mon, 6 Apr 2026 20:58:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.63 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509116; cv=none; b=kBYfoTgFsOsfjI0f91xNEnDRT1RNKx0zGChEKZhtvfUzUlhn7nHI8o16IXdjkmpM/CfEz+6Y6UfDo7qc0rtzhp07G6JwIXPCefC66L4CEm7x5oSYbrHBRF6rd+re/K7EXCD69JsBhYzv/FlsmwAtRPeWsfY621xeV4APAaBFf3U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509116; c=relaxed/simple; bh=/tUqSsPKZYI38NvYBzErNoEFI2yH5ZSUmcQTH3Qwi9M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ImVedsCJnRcJuaRwfc6/cJCmGjVojxRXitwc/7tObOLWY2UGBbXrG/HIv21ruHjf8JxmnCivLNPVZFGdUJlzK0yrmlaJJVeJfTBoAwrOTwMvh0Z45DaSlf0v9GlBjmF+jJPnQa0RYO1x2C76giNIVvx2Gcu7XcbLZNpilADXMfQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=xobzwW0M; arc=none smtp.client-ip=57.103.68.63 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="xobzwW0M" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 84A881800136; Mon, 06 Apr 2026 20:58:31 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509114; x=1778101114; bh=XsNV3TeKt94qcgOcH6jwCfpUMGvag3PrVJzWeNIntVI=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:x-icloud-hme; b=xobzwW0M45IeuldRnbFLXStVmFhQYaXKxsCIB/VRTQOXIRxSn8GO3jkmp6bjaKHacp8Lvy6f4WYjyjuxIeXdXZBOWeP6cWse8rQdEhoU7igKDtXs0MwuqgAEV9eJ8gs9PAMHBVbR95EzCyntDX9fTqV7d6ShME4UeITtdVJVjG7x9TKpWEce6pkpqb55k9dabSN3vedIqxGNhtsHuZYBveQu2ylnOWbvGISHnzDSDTLjNPk6FRx0pFSuUyVXD2Axkq3majJvDXmz1zxaUEtfSUkEl73kAW8N8p9MmcgyUEYkhzamvhMfmXXOvvQ4G1GN11unhnu9ww89q7/WrdiSMA== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id DFA081800276; Mon, 06 Apr 2026 20:58:29 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Cloutier Subject: [PATCH v1 4/9] power: supply: max17042_battery: Route MAX17055 SOC alerts through dSOCi Date: Mon, 6 Apr 2026 16:57:52 -0400 Message-ID: <20260406205759.493288-5-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: 5vwB6PRpmNOSe-fltnZDeZbQa4voeYgk X-Proofpoint-ORIG-GUID: 5vwB6PRpmNOSe-fltnZDeZbQa4voeYgk X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfX+N+/519gCEeo IDddyQjinOWk2XX+398mG/GJt9/NzApESSNQBzmEWZWculmXjmVIvettDqMT/5xYVTjXL6zhmvm 3B1vGirCyunHCEnYImN7gENy9sH+SsZFTYIxPaOW/xT94dXYJznolWlccGki50VwQ72orMZdXuL NH7DqzZlZYnGvxDrpnc0BmH0AmXIOMDqH6VsMfyAGs4D5dVjx9PDszZ1u24VYqt5k5TWIcGedMk UtYeDvLzDADv22FEBgImViMbDh8ppijYU+UmTTeDzO4VNMRDkWYQLyFXEuTTortoUQi7Ji+xPR8 951WYU6WX84KnIYIozCdr2romITn5cliP6855T0OeyoCN+iOZGALlpkWJd8ojA= X-Authority-Info-Out: v=2.4 cv=W9w1lBWk c=1 sm=1 tr=0 ts=69d41e78 cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=JV5nDvsLFxwd1KHQqJAA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 malwarescore=0 adultscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 From: Vincent Cloutier Use MAX17055 dSOCi for ordinary 1% state-of-charge notifications and leave = SALRT configured for the critical low-battery threshold instead of reprogra= mming the SALRT window on every alert. Signed-off-by: Vincent Cloutier --- drivers/power/supply/max17042_battery.c | 39 +++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index 31007ba122e5..09bb1babb0d6 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -27,6 +27,7 @@ /* Status register bits */ #define STATUS_POR_BIT (1 << 1) #define STATUS_BST_BIT (1 << 3) +#define STATUS_DSOCI_BIT (1 << 7) #define STATUS_VMN_BIT (1 << 8) #define STATUS_TMN_BIT (1 << 9) #define STATUS_SMN_BIT (1 << 10) @@ -38,6 +39,7 @@ =20 /* Interrupt mask bits */ #define CFG_ALRT_BIT_ENBL (1 << 2) +#define CFG2_DSOCI_BIT_ENBL (1 << 7) =20 #define VFSOC0_LOCK 0x0000 #define VFSOC0_UNLOCK 0x0080 @@ -52,6 +54,8 @@ =20 #define MAX17042_VMAX_TOLERANCE 50 /* 50 mV */ =20 +#define MAX17042_CRITICAL_SOC 0x03 + #define MAX17042_CURRENT_LSB 1562500ll /* 1.5625=C2=B5V/Rsense */ #define MAX17042_CAPACITY_LSB 5000000ll /* 5.0=C2=B5VH/Rsense */ #define MAX17042_TIME_LSB 5625 / 1000 /* s */ @@ -871,6 +875,34 @@ static void max17042_set_soc_threshold(struct max17042= _chip *chip, u16 off) regmap_write(map, MAX17042_SALRT_Th, soc_tr); } =20 +static void max17042_set_critical_soc_threshold(struct max17042_chip *chip) +{ + struct regmap *map =3D chip->regmap; + u32 soc; + + if (chip->pdata->enable_current_sense) + regmap_read(map, MAX17042_RepSOC, &soc); + else + regmap_read(map, MAX17042_VFSOC, &soc); + + regmap_write(map, MAX17042_SALRT_Th, + ((soc >> 8) >=3D MAX17042_CRITICAL_SOC) ? + 0xff00 + MAX17042_CRITICAL_SOC : 0xff00); +} + +static void max17042_enable_soc_alerts(struct max17042_chip *chip) +{ + if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055) { + regmap_update_bits(chip->regmap, MAX17055_Config2, + CFG2_DSOCI_BIT_ENBL, + CFG2_DSOCI_BIT_ENBL); + max17042_set_critical_soc_threshold(chip); + return; + } + + max17042_set_soc_threshold(chip, 1); +} + static irqreturn_t max17042_thread_handler(int id, void *dev) { struct max17042_chip *chip =3D dev; @@ -881,9 +913,10 @@ static irqreturn_t max17042_thread_handler(int id, voi= d *dev) if (ret) return IRQ_HANDLED; =20 - if ((val & STATUS_SMN_BIT) || (val & STATUS_SMX_BIT)) { + if ((val & STATUS_SMN_BIT) || (val & STATUS_SMX_BIT) || + (val & STATUS_DSOCI_BIT)) { dev_dbg(chip->dev, "SOC threshold INTR\n"); - max17042_set_soc_threshold(chip, 1); + max17042_enable_soc_alerts(chip); } =20 /* we implicitly handle all alerts via power_supply_changed */ @@ -1111,7 +1144,7 @@ static int max17042_probe(struct i2c_client *client, = struct device *dev, int irq regmap_update_bits(chip->regmap, MAX17042_CONFIG, CFG_ALRT_BIT_ENBL, CFG_ALRT_BIT_ENBL); - max17042_set_soc_threshold(chip, 1); + max17042_enable_soc_alerts(chip); } else { irq =3D 0; if (ret !=3D -EBUSY) --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster1-host7-snip4-10.eps.apple.com [57.103.68.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A7AD31194C for ; Mon, 6 Apr 2026 20:58:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.93 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509117; cv=none; b=VTq+0AYy1f9bak05UQpln0wOu0iSVemJ4T8fTrwwqLWWkh3TbZ15uhJEwu+kB/3fG/vUADcfmO524GEo2EotEMr3pbQhvuolDrpaVpC0HrBIueQCrNkUZcsTspKHXveOP//bp0Z/BqB2sVot/sGxIKS5a9dPoeMUfHY19fusWm4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509117; c=relaxed/simple; bh=JUgMeGaWbGx2RwTFLOZ7+apz8zFtzDRIjiomG8+nIrs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FTUVcl505Fbx8fDf9RPzPCNizilVeVhnaege8WG+XjkOTVCK9dFVTyr+v2NcGmZ7NqFjAfbqGA6iVpwmlshhq9Ikum4lNK+F8edAT8Q+lh5r8uesM5xubr5XybkVcsF8wFPkg3YAagQtVfBnEXkQhv6JgSu7viPkKAr9WvwNufs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=skyKEBZP; arc=none smtp.client-ip=57.103.68.93 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="skyKEBZP" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 7AD0A1800270; Mon, 06 Apr 2026 20:58:34 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509115; x=1778101115; bh=ymp75nBmmp9XWS0rBWuQ9vMG3TCpJN6FQR7ePzfMtuo=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=skyKEBZPfSloJf2JcscoHFUPpPib+as6BE6cj+PgfQ/eiWyHQIMBXh7vVqT4W1EoX2iycyNZUxwzatrBHBU5RHGso3tPGfj2+7g4uV/M1VEJNkgjEGOAF6pj1mAOJ7xGVcgckMhbF5iqg0u3VOGQ07x6gLx+zPWR5FQVD28Skgp1Gi7r9vM78Y7FUyKSHYu43XkImsXXWQbzRRcb21mdGPM90qI7Bs/UeDM4FQnUSzRdDiGfQagxqf78jgnENUg5qudUTASHqyagjZdLZ7ckvQxzrLpqzRqLNGEsk9+ncn8fF3ZMguAPcE0JEx9bLwRk6gOpgjCAr/4Uygc5bjn9GQ== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id 4FCCD180025D; Mon, 06 Apr 2026 20:58:33 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Cloutier Subject: [PATCH v1 5/9] power: supply: max17042_battery: Keep only critical alerts during suspend Date: Mon, 6 Apr 2026 16:57:53 -0400 Message-ID: <20260406205759.493288-6-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=PKsCOPqC c=1 sm=1 tr=0 ts=69d41e7a cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=dyxb9JdF2MQeVmfmGMwA:9 X-Proofpoint-GUID: uxSygwNtLqckvkNdTtuRpGIw_wU8BUZx X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfX5lOlXXFE9EBu 1yCXY79Id40uqrv1CSiwNv6qh3jtv8h24fK8K1B2hbhYEa2Fy1MwvK6BMTIaV9r4yt8W8ZJ6QrC bGZpllf1zftwYe88+9AQnnHm6qAiTWz38HDHRBkAQyzRxSsJCpaxRVakeYtRs2wJpmCy3EeDloL jSDce6+QRq0/Ur2//bNpA8BwgwzmQOo14StcNcF/cMf1PUeQSBFKALlcE6pItqYVoiv/AGSLARn 3RwPK+pgVxIlPG0qqTzzz2PyFYIhZHlpzEfT3F3VNFULaq46rtnRSbzfBcRCq2d4ENuKNz2K6Cs QFiwP9p46QXEDAF7I9pK4Sm+dRINlXvbnkgiGD/dHoqQDJB8rPJ9x96PfbakIk= X-Proofpoint-ORIG-GUID: uxSygwNtLqckvkNdTtuRpGIw_wU8BUZx X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 malwarescore=0 suspectscore=0 clxscore=1015 mlxlogscore=999 phishscore=0 mlxscore=0 lowpriorityscore=0 adultscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 Content-Type: text/plain; charset="utf-8" From: Vincent Cloutier Disable MAX17055 dSOCi while the system is suspended so state-of-charge cha= nges do not wake the system repeatedly. Leave SALRT armed for the critical = low-battery threshold and restore runtime alert handling on resume. Signed-off-by: Vincent Cloutier --- drivers/power/supply/max17042_battery.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index 09bb1babb0d6..b93fedf183b1 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -903,6 +903,16 @@ static void max17042_enable_soc_alerts(struct max17042= _chip *chip) max17042_set_soc_threshold(chip, 1); } =20 +static void max17042_suspend_soc_alerts(struct max17042_chip *chip) +{ + if (chip->chip_type !=3D MAXIM_DEVICE_TYPE_MAX17055) + return; + + regmap_update_bits(chip->regmap, MAX17055_Config2, + CFG2_DSOCI_BIT_ENBL, 0); + max17042_set_critical_soc_threshold(chip); +} + static irqreturn_t max17042_thread_handler(int id, void *dev) { struct max17042_chip *chip =3D dev; @@ -1220,6 +1230,7 @@ static int max17042_suspend(struct device *dev) */ if (chip->irq) { disable_irq(chip->irq); + max17042_suspend_soc_alerts(chip); enable_irq_wake(chip->irq); } =20 @@ -1233,8 +1244,8 @@ static int max17042_resume(struct device *dev) if (chip->irq) { disable_irq_wake(chip->irq); enable_irq(chip->irq); - /* re-program the SOC thresholds to 1% change */ - max17042_set_soc_threshold(chip, 1); + /* re-arm runtime SOC alerts */ + max17042_enable_soc_alerts(chip); } =20 return 0; --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster1-host3-snip4-10.eps.apple.com [57.103.68.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C074833F36B for ; Mon, 6 Apr 2026 20:58:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509124; cv=none; b=NbTMc2rG6do+MUvQrduex3WVUaYddNJdErjYmVvDEYkEh28IyCzcyIgiRC9WXL9g3M9goDZ9QONscxMUkSFJRoPNmxyTLb9iEAvKEH7L15f6zzvoSaWjSPhR4uFms1SxA+A6l/M4Hno3EcLiLMljk3dm5FyTIKW0nzwUW8s/A/g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509124; c=relaxed/simple; bh=0+Na2HcqS18Gkb0TJBYZ56EuQ4dlZjOFYc+9ha8e/+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=slK347S+oc6p53H0OJHrJT9pLGnzBuof6QwmYbDD7jkN1UPRWkbobM1PSSPb6jK8ms8i7qGbC254JSWNCd9R/OfLXYseBXIik1ImVuwj95v0Kkd7eg2g2d8/etPe94dOBVmKl9SSLqv9T9K++6gd13+M3yAexZ7GJF0lMHVXusY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=Ow94vmHk; arc=none smtp.client-ip=57.103.68.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="Ow94vmHk" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 2D97B1800270; Mon, 06 Apr 2026 20:58:39 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509120; x=1778101120; bh=a2Xl3gavdTtDCKylwYZDrfviP43GxntVPY8Z9z4YIws=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=Ow94vmHkfygupTxw2oB+eRQhv2lyFVrllSdmSwJnPnsDHjSQTQk3FWd3w0SEGLTK3cTSwrFOuLmATpXn1ijrvtr359CLMXgHXAkDCpsmZEAHFKTzGq2vWIfcPrC3BawHYUmWhx1nR+pzzLxfxPLzbZol7hUyEgfGndWnOg4mqJYaJmX460Db1YkGSMepKmDPcqhX+/JVX8LqVdexeOTBS6O4v3MEXrmKYpk/+QbWqeu7AMMTyaQZzzDJSXGm3VxLfFhevkquvl3Rl0hgfOiBkfE8LRLNH+C12P33QZa/wt336GryeOorkcANwnHKUDh4aJdmD70D+j3TWgBUjh6Idg== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id DA7D21800132; Mon, 06 Apr 2026 20:58:37 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Cloutier Subject: [PATCH v1 6/9] power: supply: max17042_battery: Remove unused platform-data plumbing Date: Mon, 6 Apr 2026 16:57:54 -0400 Message-ID: <20260406205759.493288-7-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfXwdzYh7YGcp4Y T/gkYYqmA5XDZG7SDTwwKZTHOkEWPi88P6V8GvhCD8gGhlEbEGZrVQhO31IZwdpYvEDQZezXONM dkNnyghXMPL0XcIHUTOmUUufUaweP5WUS0fgtsvWf1GsGvI53rSw6HhaTbMN/M/NJYSnJ7Pl7zz 3QRtRJBjvBXvW+1sAsDmCCV9c0tMvwvpaDMT0rBVTpVC/xg2WEZIsJ9cIIDXq16rKEmSOtYoUii XVGfoxC8TCDIsPcUnsQjKg8nBYIdamT8+JTwhFEVHuTM7glLggRqYrb6XDFx1U47LNKJKhUNa6j W0a9YluUA3YmdE/dU+4rL2ZRnpZlQV1L3YYUccyVolyotsduDFC+ym6cX6h+k0= X-Proofpoint-ORIG-GUID: Qvt34T5BiADgQ8ibSlq2q5MekIhcfg7P X-Proofpoint-GUID: Qvt34T5BiADgQ8ibSlq2q5MekIhcfg7P X-Authority-Info-Out: v=2.4 cv=Z5nh3XRA c=1 sm=1 tr=0 ts=69d41e7f cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=BWTXLzbCmJ5VM3Q8rPcA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 lowpriorityscore=0 malwarescore=0 clxscore=1015 phishscore=0 mlxlogscore=999 suspectscore=0 spamscore=0 adultscore=0 bulkscore=0 mlxscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 Content-Type: text/plain; charset="utf-8" From: Vincent Cloutier No in-tree user still provides `max17042_platform_data` or `max17042_reg_data`. Move the simple runtime fields into `struct max17042_chip`, populate them directly from DT or the default hardware state, and drop the unused public platform-data interface. While here, write the MAX17047/MAX17050 default `FullSOCThr` value directly in probe instead of carrying it through an `init_data` table. Signed-off-by: Vincent Cloutier --- drivers/power/supply/max17042_battery.c | 204 +++++++++++------------- include/linux/power/max17042_battery.h | 29 ---- 2 files changed, 89 insertions(+), 144 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index b93fedf183b1..a96427bf07d0 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -68,10 +68,17 @@ struct max17042_chip { struct regmap *regmap; struct power_supply *battery; enum max170xx_chip_type chip_type; - struct max17042_platform_data *pdata; + struct max17042_config_data *config_data; struct work_struct work; int init_complete; int irq; + bool enable_current_sense; + bool enable_por_init; + unsigned int r_sns; + int vmin; /* in millivolts */ + int vmax; /* in millivolts */ + int temp_min; /* in tenths of degree Celsius */ + int temp_max; /* in tenths of degree Celsius */ }; =20 static enum power_supply_property max17042_battery_props[] =3D { @@ -163,7 +170,7 @@ static int max17042_get_status(struct max17042_chip *ch= ip, int *status) * Even though we are supplied, we may still be discharging if the * supply is e.g. only delivering 5V 0.5A. Check current if available. */ - if (!chip->pdata->enable_current_sense) { + if (!chip->enable_current_sense) { *status =3D POWER_SUPPLY_STATUS_CHARGING; return 0; } @@ -205,12 +212,12 @@ static int max17042_get_battery_health(struct max1704= 2_chip *chip, int *health) /* Convert to millivolts */ vbatt /=3D 1000; =20 - if (vavg < chip->pdata->vmin) { + if (vavg < chip->vmin) { *health =3D POWER_SUPPLY_HEALTH_DEAD; goto out; } =20 - if (vbatt > chip->pdata->vmax + MAX17042_VMAX_TOLERANCE) { + if (vbatt > chip->vmax + MAX17042_VMAX_TOLERANCE) { *health =3D POWER_SUPPLY_HEALTH_OVERVOLTAGE; goto out; } @@ -219,12 +226,12 @@ static int max17042_get_battery_health(struct max1704= 2_chip *chip, int *health) if (ret < 0) goto health_error; =20 - if (temp < chip->pdata->temp_min) { + if (temp < chip->temp_min) { *health =3D POWER_SUPPLY_HEALTH_COLD; goto out; } =20 - if (temp > chip->pdata->temp_max) { + if (temp > chip->temp_max) { *health =3D POWER_SUPPLY_HEALTH_OVERHEAT; goto out; } @@ -325,7 +332,7 @@ static int max17042_get_property(struct power_supply *p= sy, val->intval =3D data * MAX17042_VOLTAGE_LSB; break; case POWER_SUPPLY_PROP_CAPACITY: - if (chip->pdata->enable_current_sense) + if (chip->enable_current_sense) ret =3D regmap_read(map, MAX17042_RepSOC, &data); else ret =3D regmap_read(map, MAX17042_VFSOC, &data); @@ -340,7 +347,7 @@ static int max17042_get_property(struct power_supply *p= sy, return ret; =20 data64 =3D data * MAX17042_CAPACITY_LSB; - do_div(data64, chip->pdata->r_sns); + do_div(data64, chip->r_sns); val->intval =3D data64; break; case POWER_SUPPLY_PROP_CHARGE_FULL: @@ -349,7 +356,7 @@ static int max17042_get_property(struct power_supply *p= sy, return ret; =20 data64 =3D data * MAX17042_CAPACITY_LSB; - do_div(data64, chip->pdata->r_sns); + do_div(data64, chip->r_sns); val->intval =3D data64; break; case POWER_SUPPLY_PROP_CHARGE_NOW: @@ -358,7 +365,7 @@ static int max17042_get_property(struct power_supply *p= sy, return ret; =20 data64 =3D data * MAX17042_CAPACITY_LSB; - do_div(data64, chip->pdata->r_sns); + do_div(data64, chip->r_sns); val->intval =3D data64; break; case POWER_SUPPLY_PROP_CHARGE_COUNTER: @@ -367,7 +374,7 @@ static int max17042_get_property(struct power_supply *p= sy, return ret; =20 data64 =3D sign_extend64(data, 15) * MAX17042_CAPACITY_LSB; - val->intval =3D div_s64(data64, chip->pdata->r_sns); + val->intval =3D div_s64(data64, chip->r_sns); break; case POWER_SUPPLY_PROP_TEMP: ret =3D max17042_get_temperature(chip, &val->intval); @@ -389,10 +396,10 @@ static int max17042_get_property(struct power_supply = *psy, val->intval =3D sign_extend32(data >> 8, 7) * 10; break; case POWER_SUPPLY_PROP_TEMP_MIN: - val->intval =3D chip->pdata->temp_min; + val->intval =3D chip->temp_min; break; case POWER_SUPPLY_PROP_TEMP_MAX: - val->intval =3D chip->pdata->temp_max; + val->intval =3D chip->temp_max; break; case POWER_SUPPLY_PROP_HEALTH: ret =3D max17042_get_battery_health(chip, &val->intval); @@ -403,25 +410,25 @@ static int max17042_get_property(struct power_supply = *psy, val->intval =3D POWER_SUPPLY_SCOPE_SYSTEM; break; case POWER_SUPPLY_PROP_CURRENT_NOW: - if (chip->pdata->enable_current_sense) { + if (chip->enable_current_sense) { ret =3D regmap_read(map, MAX17042_Current, &data); if (ret < 0) return ret; =20 data64 =3D sign_extend64(data, 15) * MAX17042_CURRENT_LSB; - val->intval =3D div_s64(data64, chip->pdata->r_sns); + val->intval =3D div_s64(data64, chip->r_sns); } else { return -EINVAL; } break; case POWER_SUPPLY_PROP_CURRENT_AVG: - if (chip->pdata->enable_current_sense) { + if (chip->enable_current_sense) { ret =3D regmap_read(map, MAX17042_AvgCurrent, &data); if (ret < 0) return ret; =20 data64 =3D sign_extend64(data, 15) * MAX17042_CURRENT_LSB; - val->intval =3D div_s64(data64, chip->pdata->r_sns); + val->intval =3D div_s64(data64, chip->r_sns); } else { return -EINVAL; } @@ -432,7 +439,7 @@ static int max17042_get_property(struct power_supply *p= sy, return ret; =20 data64 =3D data * MAX17042_CURRENT_LSB; - val->intval =3D div_s64(data64, chip->pdata->r_sns); + val->intval =3D div_s64(data64, chip->r_sns); break; case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: ret =3D regmap_read(map, MAX17042_TTE, &data); @@ -562,7 +569,7 @@ static inline void max17042_write_model_data(struct max= 17042_chip *chip, =20 for (i =3D 0; i < size; i++) regmap_write(map, addr + i, - chip->pdata->config_data->cell_char_tbl[i]); + chip->config_data->cell_char_tbl[i]); } =20 static inline void max17042_read_model_data(struct max17042_chip *chip, @@ -597,7 +604,7 @@ static inline int max17042_model_data_compare(struct ma= x17042_chip *chip, static int max17042_init_model(struct max17042_chip *chip) { int ret; - int table_size =3D ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl); + int table_size =3D ARRAY_SIZE(chip->config_data->cell_char_tbl); u16 *temp_data; =20 temp_data =3D kcalloc(table_size, sizeof(*temp_data), GFP_KERNEL); @@ -612,7 +619,7 @@ static int max17042_init_model(struct max17042_chip *ch= ip) =20 ret =3D max17042_model_data_compare( chip, - chip->pdata->config_data->cell_char_tbl, + chip->config_data->cell_char_tbl, temp_data, table_size); =20 @@ -625,7 +632,7 @@ static int max17042_init_model(struct max17042_chip *ch= ip) static int max17042_verify_model_lock(struct max17042_chip *chip) { int i; - int table_size =3D ARRAY_SIZE(chip->pdata->config_data->cell_char_tbl); + int table_size =3D ARRAY_SIZE(chip->config_data->cell_char_tbl); u16 *temp_data; int ret =3D 0; =20 @@ -645,7 +652,7 @@ static int max17042_verify_model_lock(struct max17042_c= hip *chip) =20 static void max17042_write_config_regs(struct max17042_chip *chip) { - struct max17042_config_data *config =3D chip->pdata->config_data; + struct max17042_config_data *config =3D chip->config_data; struct regmap *map =3D chip->regmap; =20 regmap_write(map, MAX17042_CONFIG, config->config); @@ -662,7 +669,7 @@ static void max17042_write_config_regs(struct max17042_= chip *chip) =20 static void max17042_write_custom_regs(struct max17042_chip *chip) { - struct max17042_config_data *config =3D chip->pdata->config_data; + struct max17042_config_data *config =3D chip->config_data; struct regmap *map =3D chip->regmap; =20 max17042_write_verify_reg(map, MAX17042_RCOMP0, config->rcomp0); @@ -686,7 +693,7 @@ static void max17042_write_custom_regs(struct max17042= _chip *chip) =20 static void max17042_update_capacity_regs(struct max17042_chip *chip) { - struct max17042_config_data *config =3D chip->pdata->config_data; + struct max17042_config_data *config =3D chip->config_data; struct regmap *map =3D chip->regmap; =20 max17042_write_verify_reg(map, MAX17042_FullCAP, @@ -712,7 +719,7 @@ static void max17042_load_new_capacity_params(struct ma= x17042_chip *chip) u32 full_cap0, rep_cap, dq_acc, vfSoc; u32 rem_cap; =20 - struct max17042_config_data *config =3D chip->pdata->config_data; + struct max17042_config_data *config =3D chip->config_data; struct regmap *map =3D chip->regmap; =20 regmap_read(map, MAX17042_FullCAP0, &full_cap0); @@ -744,14 +751,14 @@ static void max17042_load_new_capacity_params(struct = max17042_chip *chip) } =20 /* - * Block write all the override values coming from platform data. + * Block write all the override values coming from config_data. * This function MUST be called before the POR initialization procedure * specified by maxim. */ static inline void max17042_override_por_values(struct max17042_chip *chip) { struct regmap *map =3D chip->regmap; - struct max17042_config_data *config =3D chip->pdata->config_data; + struct max17042_config_data *config =3D chip->config_data; =20 max17042_override_por(map, MAX17042_TGAIN, config->tgain); max17042_override_por(map, MAX17042_TOFF, config->toff); @@ -864,7 +871,7 @@ static void max17042_set_soc_threshold(struct max17042_= chip *chip, u16 off) /* program interrupt thresholds such that we should * get interrupt for every 'off' perc change in the soc */ - if (chip->pdata->enable_current_sense) + if (chip->enable_current_sense) regmap_read(map, MAX17042_RepSOC, &soc); else regmap_read(map, MAX17042_VFSOC, &soc); @@ -880,7 +887,7 @@ static void max17042_set_critical_soc_threshold(struct = max17042_chip *chip) struct regmap *map =3D chip->regmap; u32 soc; =20 - if (chip->pdata->enable_current_sense) + if (chip->enable_current_sense) regmap_read(map, MAX17042_RepSOC, &soc); else regmap_read(map, MAX17042_VFSOC, &soc); @@ -943,8 +950,8 @@ static void max17042_init_worker(struct work_struct *wo= rk) struct max17042_chip, work); int ret; =20 - /* Initialize registers according to values from the platform data */ - if (chip->pdata->enable_por_init && chip->pdata->config_data) { + /* Initialize registers according to values from config_data */ + if (chip->enable_por_init && chip->config_data) { ret =3D max17042_init_chip(chip); if (ret) return; @@ -954,102 +961,56 @@ static void max17042_init_worker(struct work_struct = *work) } =20 #ifdef CONFIG_OF -static struct max17042_platform_data * -max17042_get_of_pdata(struct max17042_chip *chip) +static int max17042_parse_dt(struct max17042_chip *chip) { - struct device *dev =3D chip->dev; - struct device_node *np =3D dev->of_node; + struct device_node *np =3D chip->dev->of_node; u32 prop; - struct max17042_platform_data *pdata; - - pdata =3D devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return NULL; =20 /* * Require current sense resistor value to be specified for * current-sense functionality to be enabled at all. */ if (of_property_read_u32(np, "maxim,rsns-microohm", &prop) =3D=3D 0) { - pdata->r_sns =3D prop; - pdata->enable_current_sense =3D true; + chip->r_sns =3D prop; + chip->enable_current_sense =3D true; } =20 - if (of_property_read_s32(np, "maxim,cold-temp", &pdata->temp_min)) - pdata->temp_min =3D INT_MIN; - if (of_property_read_s32(np, "maxim,over-heat-temp", &pdata->temp_max)) - pdata->temp_max =3D INT_MAX; - if (of_property_read_s32(np, "maxim,dead-volt", &pdata->vmin)) - pdata->vmin =3D INT_MIN; - if (of_property_read_s32(np, "maxim,over-volt", &pdata->vmax)) - pdata->vmax =3D INT_MAX; + if (of_property_read_s32(np, "maxim,cold-temp", &chip->temp_min)) + chip->temp_min =3D INT_MIN; + if (of_property_read_s32(np, "maxim,over-heat-temp", &chip->temp_max)) + chip->temp_max =3D INT_MAX; + if (of_property_read_s32(np, "maxim,dead-volt", &chip->vmin)) + chip->vmin =3D INT_MIN; + if (of_property_read_s32(np, "maxim,over-volt", &chip->vmax)) + chip->vmax =3D INT_MAX; =20 - return pdata; + return 0; } #endif =20 -static struct max17042_reg_data max17047_default_pdata_init_regs[] =3D { - /* - * Some firmwares do not set FullSOCThr, Enable End-of-Charge Detection - * when the voltage FG reports 95%, as recommended in the datasheet. - */ - { MAX17047_FullSOCThr, MAX17042_BATTERY_FULL << 8 }, -}; - -static struct max17042_platform_data * -max17042_get_default_pdata(struct max17042_chip *chip) +static int max17042_init_defaults(struct max17042_chip *chip) { - struct device *dev =3D chip->dev; - struct max17042_platform_data *pdata; int ret, misc_cfg; =20 /* - * The MAX17047 gets used on x86 where we might not have pdata, assume + * The MAX17047 gets used on x86 where we might not have DT, assume * the firmware will already have initialized the fuel-gauge and provide * default values for the non init bits to make things work. */ - pdata =3D devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return pdata; - - if ((chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17047) || - (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17050)) { - pdata->init_data =3D max17047_default_pdata_init_regs; - pdata->num_init_data =3D - ARRAY_SIZE(max17047_default_pdata_init_regs); - } =20 ret =3D regmap_read(chip->regmap, MAX17042_MiscCFG, &misc_cfg); if (ret < 0) - return NULL; + return ret; =20 /* If bits 0-1 are set to 3 then only Voltage readings are used */ - if ((misc_cfg & 0x3) =3D=3D 0x3) - pdata->enable_current_sense =3D false; - else - pdata->enable_current_sense =3D true; + chip->enable_current_sense =3D (misc_cfg & 0x3) !=3D 0x3; =20 - pdata->vmin =3D MAX17042_DEFAULT_VMIN; - pdata->vmax =3D MAX17042_DEFAULT_VMAX; - pdata->temp_min =3D MAX17042_DEFAULT_TEMP_MIN; - pdata->temp_max =3D MAX17042_DEFAULT_TEMP_MAX; + chip->vmin =3D MAX17042_DEFAULT_VMIN; + chip->vmax =3D MAX17042_DEFAULT_VMAX; + chip->temp_min =3D MAX17042_DEFAULT_TEMP_MIN; + chip->temp_max =3D MAX17042_DEFAULT_TEMP_MAX; =20 - return pdata; -} - -static struct max17042_platform_data * -max17042_get_pdata(struct max17042_chip *chip) -{ - struct device *dev =3D chip->dev; - -#ifdef CONFIG_OF - if (dev->of_node) - return max17042_get_of_pdata(chip); -#endif - if (dev->platform_data) - return dev->platform_data; - - return max17042_get_default_pdata(chip); + return 0; } =20 static const struct regmap_config max17042_regmap_config =3D { @@ -1088,8 +1049,8 @@ static int max17042_probe(struct i2c_client *client, = struct device *dev, int irq struct power_supply_config psy_cfg =3D {}; struct max17042_chip *chip; int ret; - int i; u32 val; + bool use_default_config =3D false; =20 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) return -EIO; @@ -1106,10 +1067,19 @@ static int max17042_probe(struct i2c_client *client= , struct device *dev, int irq return -EINVAL; } =20 - chip->pdata =3D max17042_get_pdata(chip); - if (!chip->pdata) { - dev_err(dev, "no platform data provided\n"); - return -EINVAL; + +#ifdef CONFIG_OF + if (dev->of_node) { + ret =3D max17042_parse_dt(chip); + if (ret) + return ret; + } else +#endif + { + ret =3D max17042_init_defaults(chip); + if (ret) + return ret; + use_default_config =3D true; } =20 dev_set_drvdata(dev, chip); @@ -1118,19 +1088,13 @@ static int max17042_probe(struct i2c_client *client= , struct device *dev, int irq =20 /* When current is not measured, * CURRENT_NOW and CURRENT_AVG properties should be invisible. */ - if (!chip->pdata->enable_current_sense) + if (!chip->enable_current_sense) max17042_desc =3D &max17042_no_current_sense_psy_desc; =20 - if (chip->pdata->r_sns =3D=3D 0) - chip->pdata->r_sns =3D MAX17042_DEFAULT_SNS_RESISTOR; + if (chip->r_sns =3D=3D 0) + chip->r_sns =3D MAX17042_DEFAULT_SNS_RESISTOR; =20 - if (chip->pdata->init_data) - for (i =3D 0; i < chip->pdata->num_init_data; i++) - regmap_write(chip->regmap, - chip->pdata->init_data[i].addr, - chip->pdata->init_data[i].data); - - if (!chip->pdata->enable_current_sense) { + if (!chip->enable_current_sense) { regmap_write(chip->regmap, MAX17042_CGAIN, 0x0000); regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003); regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007); @@ -1142,6 +1106,16 @@ static int max17042_probe(struct i2c_client *client,= struct device *dev, int irq return dev_err_probe(dev, PTR_ERR(chip->battery), "failed: power supply register\n"); =20 + /* + * Some firmwares do not set FullSOCThr, Enable End-of-Charge Detection + * when the voltage FG reports 95%, as recommended in the datasheet. + */ + if (use_default_config && + (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17047 || + chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17050)) + regmap_write(chip->regmap, MAX17047_FullSOCThr, + MAX17042_BATTERY_FULL << 8); + if (irq) { unsigned int flags =3D IRQF_ONESHOT | IRQF_SHARED | IRQF_PROBE_SHARED; =20 diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/m= ax17042_battery.h index c417abd2ab70..36817da50548 100644 --- a/include/linux/power/max17042_battery.h +++ b/include/linux/power/max17042_battery.h @@ -177,16 +177,6 @@ enum max170xx_chip_type { MAXIM_DEVICE_TYPE_NUM }; =20 -/* - * used for setting a register to a desired value - * addr : address for a register - * data : setting value for the register - */ -struct max17042_reg_data { - u8 addr; - u16 data; -}; - struct max17042_config_data { /* External current sense resistor value in milli-ohms */ u32 cur_sense_val; @@ -244,23 +234,4 @@ struct max17042_config_data { u16 cell_char_tbl[MAX17042_CHARACTERIZATION_DATA_SIZE]; } __packed; =20 -struct max17042_platform_data { - struct max17042_reg_data *init_data; - struct max17042_config_data *config_data; - int num_init_data; /* Number of enties in init_data array */ - bool enable_current_sense; - bool enable_por_init; /* Use POR init from Maxim appnote */ - - /* - * R_sns in micro-ohms. - * default 10000 (if r_sns =3D 0) as it is the recommended value by - * the datasheet although it can be changed by board designers. - */ - unsigned int r_sns; - int vmin; /* in millivolts */ - int vmax; /* in millivolts */ - int temp_min; /* in tenths of degree Celsius */ - int temp_max; /* in tenths of degree Celsius */ -}; - #endif /* __MAX17042_BATTERY_H_ */ --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster1-host7-snip4-6.eps.apple.com [57.103.68.89]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5B7631194C for ; Mon, 6 Apr 2026 20:58:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.89 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509122; cv=none; b=hl1zo7aVTXvvAK+g0LZSAtb+JVLnBM3PvSgkM8WwpxqUjUNf7HqgsVJCFLkUNqCmumBkMrAYICewX9K9ROZPazAqE3MEhympNbN6TzD4Cpu9JcUpAv7B5oH6AL1at0cOJFADzkrhSZ1o0zwtbDoVh3IWXGeSylIeuydtzc9i0xk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509122; c=relaxed/simple; bh=VGF9CdON+K8pKfnZszUFSZhF5E+/A8ZhNaLUjjqtSNs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X6Cvw6gLU2mefnD7iWUiH2h6lreqUeAtir9pqk0+fcizBWam46r1Z8unZ1b2b6x2ALvuqPNk2JZ48RM80AU70X14IjltkASrlPrdd2B7YW7jXmOPwZsH/CpOcmZ957kXcUBgM67Cr7wdb0/fFb7m5zANaY+rpMpkmqEkmgJ5bJM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=tN3Di2ud; arc=none smtp.client-ip=57.103.68.89 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="tN3Di2ud" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 4521F180024F; Mon, 06 Apr 2026 20:58:40 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509121; x=1778101121; bh=VgFfxoY/ooFYi0cIyI+4Ozs8g/oWwJGlqR9ylRYHt+A=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=tN3Di2ud9E16b/LBYUFXkUjyU7d0EztOubO77CRw7YAQrvXrtcokLP2Kb/C/eUBzY5i7fFulzrwYOU/ofYTCbS/3lhCv7q54SmCAhDPZ/+tipDHcQaqkfkUDPUXc8ULDfE9FI1T3+kFT3i55CWB8g/l3Q1HLzkMgDDRC2T1ZEUDNM8P9cXHgkUKO8NYXrVYQJzyp5wFe3kmwfDT8r72eXrVXT4ddOzQdATN92eebwRjnpZNdiUd31ifTeB4FFRyLBTwRRcjxuRCG7TFTBNRYSkNHnnkqp2gD8+5iE/otNPu93E1iAat+OTfnPFpgzbWUC9lyHFIDnvhOSjdD7UqE8g== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id 0B595180026F; Mon, 06 Apr 2026 20:58:38 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Cloutier Subject: [PATCH v1 7/9] power: supply: max17042_battery: use ModelCfg refresh on max17055 Date: Mon, 6 Apr 2026 16:57:55 -0400 Message-ID: <20260406205759.493288-8-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: yPX3nI8D5QENh65DtjW4-UsiffUqYEAu X-Proofpoint-ORIG-GUID: yPX3nI8D5QENh65DtjW4-UsiffUqYEAu X-Authority-Info-Out: v=2.4 cv=dcKNHHXe c=1 sm=1 tr=0 ts=69d41e80 cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=9q-Kekzt8HrGINVsJWkA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfX5gXypzwAl7ir d7ynI/0LGQPdZzbMoQolwKCF6dLT5umJvMbf7QZjhIw1eZNNr2NRvFm7AlvNb5x1P35rwiru3wV Vng1Ky33GeVv36z1Fcgwbh4kzztpl5KFk0CEzpplOTfgC+sy0dybMYdsfuUDv8TZqesP+99VrBZ hNnXZdrwI5zN73wI1jAFv6S5SoMA/gO0m4pFU2z2EvedWfI5CnE/0ledr1Ef+F2jhakLVRKdFsU IABCdG0yOi6XQevEuWLnmNtfstwlJA0fHbikukeCyaBtfcvkeogxh495FS4gC7QQCzmjDnfEFGG EEkPUA5P0GgcR4cLXdvePgT9grEkN42h/K0KBE0HQLwTjp6PYN2Rkv8Wac2O5w= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 clxscore=1015 spamscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 mlxscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 Content-Type: text/plain; charset="utf-8" From: Sebastian Krzyszkowiak Unlike other models, max17055 doesn't require cell characterization data and operates on a smaller set of input variables (`DesignCap`, `VEmpty`, `IChgTerm`, and `ModelCfg`). Those values can be filled in through `max17042_override_por_values()`, but the refresh bit has to be set afterward in order to make them apply. Signed-off-by: Sebastian Krzyszkowiak Signed-off-by: Vincent Cloutier --- drivers/power/supply/max17042_battery.c | 66 +++++++++++++++---------- include/linux/power/max17042_battery.h | 3 ++ 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index a96427bf07d0..793164bd55d9 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -811,6 +811,9 @@ static inline void max17042_override_por_values(struct = max17042_chip *chip) (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055)) { max17042_override_por(map, MAX17047_V_empty, config->vempty); } + + if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055) + max17042_override_por(map, MAX17055_ModelCfg, config->model_cfg); } =20 static int max17042_init_chip(struct max17042_chip *chip) @@ -819,44 +822,53 @@ static int max17042_init_chip(struct max17042_chip *c= hip) int ret; =20 max17042_override_por_values(chip); + + if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055) { + regmap_write_bits(map, MAX17055_ModelCfg, + MAX17055_MODELCFG_REFRESH_BIT, + MAX17055_MODELCFG_REFRESH_BIT); + } + /* After Power up, the MAX17042 requires 500mS in order * to perform signal debouncing and initial SOC reporting */ msleep(500); =20 - /* Initialize configuration */ - max17042_write_config_regs(chip); + if (chip->chip_type !=3D MAXIM_DEVICE_TYPE_MAX17055) { + /* Initialize configuration */ + max17042_write_config_regs(chip); =20 - /* write cell characterization data */ - ret =3D max17042_init_model(chip); - if (ret) { - dev_err(chip->dev, "%s init failed\n", - __func__); - return -EIO; - } + /* write cell characterization data */ + ret =3D max17042_init_model(chip); + if (ret) { + dev_err(chip->dev, "%s init failed\n", + __func__); + return -EIO; + } =20 - ret =3D max17042_verify_model_lock(chip); - if (ret) { - dev_err(chip->dev, "%s lock verify failed\n", - __func__); - return -EIO; - } - /* write custom parameters */ - max17042_write_custom_regs(chip); + ret =3D max17042_verify_model_lock(chip); + if (ret) { + dev_err(chip->dev, "%s lock verify failed\n", + __func__); + return -EIO; + } + /* write custom parameters */ + max17042_write_custom_regs(chip); =20 - /* update capacity params */ - max17042_update_capacity_regs(chip); + /* update capacity params */ + max17042_update_capacity_regs(chip); =20 - /* delay must be atleast 350mS to allow VFSOC - * to be calculated from the new configuration - */ - msleep(350); + /* delay must be atleast 350mS to allow VFSOC + * to be calculated from the new configuration + */ + msleep(350); =20 - /* reset vfsoc0 reg */ - max17042_reset_vfsoc0_reg(chip); + /* reset vfsoc0 reg */ + max17042_reset_vfsoc0_reg(chip); =20 - /* load new capacity params */ - max17042_load_new_capacity_params(chip); + /* load new capacity params */ + max17042_load_new_capacity_params(chip); + } =20 /* Init complete, Clear the POR bit */ regmap_update_bits(map, MAX17042_STATUS, STATUS_POR_BIT, 0x0); diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/m= ax17042_battery.h index 36817da50548..6b6e01d3e499 100644 --- a/include/linux/power/max17042_battery.h +++ b/include/linux/power/max17042_battery.h @@ -23,6 +23,8 @@ =20 #define MAX17042_CHARACTERIZATION_DATA_SIZE 48 =20 +#define MAX17055_MODELCFG_REFRESH_BIT BIT(15) + enum max17042_register { MAX17042_STATUS =3D 0x00, MAX17042_VALRT_Th =3D 0x01, @@ -198,6 +200,7 @@ struct max17042_config_data { u16 full_soc_thresh; /* 0x13 */ u16 design_cap; /* 0x18 */ u16 ichgt_term; /* 0x1E */ + u16 model_cfg; /* 0xDB */ =20 /* MG3 config */ u16 at_rate; /* 0x04 */ --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster1-host5-snip4-6.eps.apple.com [57.103.68.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A99F5331211 for ; Mon, 6 Apr 2026 20:58:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509124; cv=none; b=g4B86Ds+N38JUymy5oAVodvgYZfgUjtiSmM+0Og17iifRUIkyDQXfhZZo4V15QUAhkucuwjCs1ZLrV/6Nk4whDlVpVPnAQoW8nFUXNmNqqUH/wRS1evreV9B8yzAWNEUEr2K06l2KPzqPi+qNUHgJNvi0D2HHtdJ45MOYdSZ6Mk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509124; c=relaxed/simple; bh=c0Tm6gUVO8eXh0ngq8yEi44CnKTh4grDBpjqyrMuG3A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UTS3PJFMW8eUoWAgOJs/BfoBuulkHVPqsSqNvb5KVGptge6tO16J5yiwIgOOLNQ3cihblAsDtXl1zsu663ueyR/TujZXQgcwt7L/EOd1NiN90vmqqm58nyMsgygrVs6wuS7S0TTDUb7hT+8cNinbOYY583qoG3WRAFk3MwyJgUs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=GpmagIRO; arc=none smtp.client-ip=57.103.68.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="GpmagIRO" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 4F77F1800276; Mon, 06 Apr 2026 20:58:41 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509122; x=1778101122; bh=ngkPovcK5vHtdBVUS/5qRg0nyTmDHTx7VvRDaWX4Huo=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=GpmagIRO2PFIDkJCLPlaQZS0ZOBJm57iySkCfAReDOjEhb2wo70oAXI3wt2Qc9UaEwojNNqgt+kLJ3cpckBwKX2ZqAKJFtP7hLK9Wudb46Y/QP6PjgKuoskuJtO4BiLev7uf8Be5p73kvXXJsnnAVXcf97sDt/DugME2fvhW2utGknmT5dailaM5A5aPC+U22IHQoHZvjtLOYjYuTFhqd3KOZdckAe1xiT0sCx2RbiHj47YfQQmSbxgz/8P34H9JAxbRk7c8XaUQWigP+eRgTWyNiPC1pKeG7a0C/vBhvI9oPnNFUiQay+B2gHcELRxIhSQVSghowGGsOBaJH40lZQ== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id 24B4C1800277; Mon, 06 Apr 2026 20:58:40 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Cloutier Subject: [PATCH v1 8/9] power: supply: Read MAX17042 battery info before registration Date: Mon, 6 Apr 2026 16:57:56 -0400 Message-ID: <20260406205759.493288-9-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: 1JmlubVl1nVrWppVL01zX9CC8bIQ51OK X-Proofpoint-ORIG-GUID: 1JmlubVl1nVrWppVL01zX9CC8bIQ51OK X-Authority-Info-Out: v=2.4 cv=dcKNHHXe c=1 sm=1 tr=0 ts=69d41e81 cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=OUvvsuZA6Cg3MKn36OAA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfXzZRhShFw+N9R JL+mrrU8gmQebU3bWaD0gHU7u5QOqUp/grY7lFo1QOMDm9JQQad6+WrWcN+HFaLaPQztcBU3gzP 8t3ihECyWJ7nOQHRE+YCZZOxQm1HMEYyBEeHJcsRdBO6WkHSLHpEvULY+Z5s66WWXm5Arh97iC0 0w9inemMl8Evh6wbD7w9G9eGYT6MT9InY483g4IdSgdNg6/wyVPyzjqgIB3VxF3SEmkIT5HyD+3 gc6V7Z2lU7KDOrBABg+nJLPUcjZLPTmLYKKARU+rABEtwdxhOB+AcBI0ynmZH/5NbX9978KEXIx gfL39C/3ju1HUeRzeeMenlBbs8o8zEjip3jHTlMUsGkbdXieajwuttLU+DCFHk= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 clxscore=1015 spamscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 mlxscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 Content-Type: text/plain; charset="utf-8" From: Vincent Cloutier Rework the MAX17042 `monitored-battery` path so the driver can consume DT battery information before registering its power-supply device. To do that, factor the parser in `power_supply_core` behind a new `devm_power_supply_get_battery_info()` helper and let battery drivers pass the pre-parsed `battery_info` through `struct power_supply_config`. MAX17042 can then apply the design-capacity and termination-current data before registration without exposing the battery too early or reparsing the same node later in the class core. Signed-off-by: Vincent Cloutier --- drivers/power/supply/max17042_battery.c | 62 ++++++++ drivers/power/supply/power_supply_core.c | 188 ++++++++++++++--------- include/linux/power/max17042_battery.h | 1 + include/linux/power_supply.h | 10 ++ 4 files changed, 187 insertions(+), 74 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index 793164bd55d9..5bf15c19fc5d 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -1025,6 +1025,57 @@ static int max17042_init_defaults(struct max17042_ch= ip *chip) return 0; } =20 +static int max17042_apply_battery_properties(struct max17042_chip *chip, + struct power_supply_battery_info *info) +{ + struct device *dev =3D chip->dev; + bool needs_config; + u64 data64; + + if (!info) + return 0; + + needs_config =3D (chip->enable_current_sense && + (info->charge_full_design_uah !=3D -EINVAL || + info->charge_term_current_ua !=3D -EINVAL)) || + (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055 && + info->voltage_max_design_uv > 4250000); + if (!needs_config) + return 0; + + if (!chip->config_data) { + chip->config_data =3D devm_kzalloc(dev, + sizeof(*chip->config_data), + GFP_KERNEL); + if (!chip->config_data) + return -ENOMEM; + } + + if (chip->enable_current_sense && + info->charge_full_design_uah !=3D -EINVAL) { + data64 =3D (u64)info->charge_full_design_uah * chip->r_sns; + do_div(data64, MAX17042_CAPACITY_LSB); + chip->config_data->design_cap =3D (u16)data64; + chip->enable_por_init =3D true; + } + + if (chip->enable_current_sense && + info->charge_term_current_ua !=3D -EINVAL) { + data64 =3D (u64)info->charge_term_current_ua * chip->r_sns; + do_div(data64, MAX17042_CURRENT_LSB); + chip->config_data->ichgt_term =3D (u16)data64; + chip->enable_por_init =3D true; + } + + if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055 && + info->voltage_max_design_uv > 4250000) { + chip->config_data->model_cfg =3D MAX17055_MODELCFG_VCHG_BIT; + chip->enable_por_init =3D true; + } + + return 0; +} + static const struct regmap_config max17042_regmap_config =3D { .name =3D "max17042", .reg_bits =3D 8, @@ -1060,6 +1111,7 @@ static int max17042_probe(struct i2c_client *client, = struct device *dev, int irq const struct power_supply_desc *max17042_desc =3D &max17042_psy_desc; struct power_supply_config psy_cfg =3D {}; struct max17042_chip *chip; + struct power_supply_battery_info *battery_info =3D NULL; int ret; u32 val; bool use_default_config =3D false; @@ -1106,12 +1158,22 @@ static int max17042_probe(struct i2c_client *client= , struct device *dev, int irq if (chip->r_sns =3D=3D 0) chip->r_sns =3D MAX17042_DEFAULT_SNS_RESISTOR; =20 + ret =3D devm_power_supply_get_battery_info(dev, &battery_info); + if (ret && ret !=3D -ENODEV && ret !=3D -ENOENT) + return ret; + + ret =3D max17042_apply_battery_properties(chip, battery_info); + if (ret) + return ret; + if (!chip->enable_current_sense) { regmap_write(chip->regmap, MAX17042_CGAIN, 0x0000); regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003); regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007); } =20 + psy_cfg.battery_info =3D battery_info; + chip->battery =3D devm_power_supply_register(dev, max17042_desc, &psy_cfg); if (IS_ERR(chip->battery)) diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/suppl= y/power_supply_core.c index a446d3d086fc..7ca3ed34095e 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -577,20 +577,76 @@ struct power_supply *devm_power_supply_get_by_referen= ce(struct device *dev, } EXPORT_SYMBOL_GPL(devm_power_supply_get_by_reference); =20 -int power_supply_get_battery_info(struct power_supply *psy, - struct power_supply_battery_info **info_out) +static void __power_supply_put_battery_info(struct device *dev, + struct power_supply_battery_info *info) +{ + int i; + + for (i =3D 0; i < POWER_SUPPLY_OCV_TEMP_MAX; i++) { + if (info->ocv_table[i]) + devm_kfree(dev, info->ocv_table[i]); + } + + if (info->resist_table) + devm_kfree(dev, info->resist_table); + + devm_kfree(dev, info); +} + +static void power_supply_init_battery_info(struct power_supply_battery_inf= o *info) +{ + int index; + + info->technology =3D POWER_SUPPLY_TECHNOLOGY_UNKNOWN; + info->energy_full_design_uwh =3D -EINVAL; + info->charge_full_design_uah =3D -EINVAL; + info->voltage_min_design_uv =3D -EINVAL; + info->voltage_max_design_uv =3D -EINVAL; + info->precharge_current_ua =3D -EINVAL; + info->charge_term_current_ua =3D -EINVAL; + info->constant_charge_current_max_ua =3D -EINVAL; + info->constant_charge_voltage_max_uv =3D -EINVAL; + info->tricklecharge_current_ua =3D -EINVAL; + info->precharge_voltage_max_uv =3D -EINVAL; + info->charge_restart_voltage_uv =3D -EINVAL; + info->overvoltage_limit_uv =3D -EINVAL; + info->maintenance_charge =3D NULL; + info->alert_low_temp_charge_current_ua =3D -EINVAL; + info->alert_low_temp_charge_voltage_uv =3D -EINVAL; + info->alert_high_temp_charge_current_ua =3D -EINVAL; + info->alert_high_temp_charge_voltage_uv =3D -EINVAL; + info->temp_ambient_alert_min =3D INT_MIN; + info->temp_ambient_alert_max =3D INT_MAX; + info->temp_alert_min =3D INT_MIN; + info->temp_alert_max =3D INT_MAX; + info->temp_min =3D INT_MIN; + info->temp_max =3D INT_MAX; + info->factory_internal_resistance_uohm =3D -EINVAL; + info->resist_table =3D NULL; + info->bti_resistance_ohm =3D -EINVAL; + info->bti_resistance_tolerance =3D -EINVAL; + + for (index =3D 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) { + info->ocv_table[index] =3D NULL; + info->ocv_temp[index] =3D -EINVAL; + info->ocv_table_size[index] =3D -EINVAL; + } +} + +static int __power_supply_get_battery_info(struct device *dev, + struct fwnode_handle *srcnode, + struct power_supply_battery_info **info_out) { struct power_supply_resistance_temp_table *resist_table; struct power_supply_battery_info *info; - struct fwnode_handle *srcnode, *fwnode; + struct fwnode_handle *fwnode; const char *value; int err, len, index, proplen; u32 *propdata __free(kfree) =3D NULL; u32 min_max[2]; =20 - srcnode =3D dev_fwnode(&psy->dev); - if (!srcnode && psy->dev.parent) - srcnode =3D dev_fwnode(psy->dev.parent); + if (!srcnode) + return -ENODEV; =20 fwnode =3D fwnode_find_reference(srcnode, "monitored-battery", 0); if (IS_ERR(fwnode)) @@ -602,7 +658,7 @@ int power_supply_get_battery_info(struct power_supply *= psy, =20 =20 /* Try static batteries first */ - err =3D samsung_sdi_battery_get_info(&psy->dev, value, &info); + err =3D samsung_sdi_battery_get_info(dev, value, &info); if (!err) goto out_ret_pointer; else if (err =3D=3D -ENODEV) @@ -617,46 +673,13 @@ int power_supply_get_battery_info(struct power_supply= *psy, goto out_put_node; } =20 - info =3D devm_kzalloc(&psy->dev, sizeof(*info), GFP_KERNEL); + info =3D devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); if (!info) { err =3D -ENOMEM; goto out_put_node; } =20 - info->technology =3D POWER_SUPPLY_TECHNOLOGY_UNKNOWN; - info->energy_full_design_uwh =3D -EINVAL; - info->charge_full_design_uah =3D -EINVAL; - info->voltage_min_design_uv =3D -EINVAL; - info->voltage_max_design_uv =3D -EINVAL; - info->precharge_current_ua =3D -EINVAL; - info->charge_term_current_ua =3D -EINVAL; - info->constant_charge_current_max_ua =3D -EINVAL; - info->constant_charge_voltage_max_uv =3D -EINVAL; - info->tricklecharge_current_ua =3D -EINVAL; - info->precharge_voltage_max_uv =3D -EINVAL; - info->charge_restart_voltage_uv =3D -EINVAL; - info->overvoltage_limit_uv =3D -EINVAL; - info->maintenance_charge =3D NULL; - info->alert_low_temp_charge_current_ua =3D -EINVAL; - info->alert_low_temp_charge_voltage_uv =3D -EINVAL; - info->alert_high_temp_charge_current_ua =3D -EINVAL; - info->alert_high_temp_charge_voltage_uv =3D -EINVAL; - info->temp_ambient_alert_min =3D INT_MIN; - info->temp_ambient_alert_max =3D INT_MAX; - info->temp_alert_min =3D INT_MIN; - info->temp_alert_max =3D INT_MAX; - info->temp_min =3D INT_MIN; - info->temp_max =3D INT_MAX; - info->factory_internal_resistance_uohm =3D -EINVAL; - info->resist_table =3D NULL; - info->bti_resistance_ohm =3D -EINVAL; - info->bti_resistance_tolerance =3D -EINVAL; - - for (index =3D 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) { - info->ocv_table[index] =3D NULL; - info->ocv_temp[index] =3D -EINVAL; - info->ocv_table_size[index] =3D -EINVAL; - } + power_supply_init_battery_info(info); =20 /* The property and field names below must correspond to elements * in enum power_supply_property. For reasoning, see @@ -678,7 +701,7 @@ int power_supply_get_battery_info(struct power_supply *= psy, else if (!strcmp("lithium-ion-manganese-oxide", value)) info->technology =3D POWER_SUPPLY_TECHNOLOGY_LiMn; else - dev_warn(&psy->dev, "%s unknown battery type\n", value); + dev_warn(dev, "%s unknown battery type\n", value); } =20 fwnode_property_read_u32(fwnode, "energy-full-design-microwatt-hours", @@ -729,7 +752,7 @@ int power_supply_get_battery_info(struct power_supply *= psy, err =3D len; goto out_put_node; } else if (len > POWER_SUPPLY_OCV_TEMP_MAX) { - dev_err(&psy->dev, "Too many temperature values\n"); + dev_err(dev, "Too many temperature values\n"); err =3D -EINVAL; goto out_put_node; } else if (len > 0) { @@ -744,28 +767,28 @@ int power_supply_get_battery_info(struct power_supply= *psy, char *propname __free(kfree) =3D kasprintf(GFP_KERNEL, "ocv-capacity-tab= le-%d", index); if (!propname) { - power_supply_put_battery_info(psy, info); + __power_supply_put_battery_info(dev, info); err =3D -ENOMEM; goto out_put_node; } proplen =3D fwnode_property_count_u32(fwnode, propname); if (proplen < 0 || proplen % 2 !=3D 0) { - dev_err(&psy->dev, "failed to get %s\n", propname); - power_supply_put_battery_info(psy, info); + dev_err(dev, "failed to get %s\n", propname); + __power_supply_put_battery_info(dev, info); err =3D -EINVAL; goto out_put_node; } =20 u32 *propdata __free(kfree) =3D kcalloc(proplen, sizeof(*propdata), GFP_= KERNEL); if (!propdata) { - power_supply_put_battery_info(psy, info); + __power_supply_put_battery_info(dev, info); err =3D -EINVAL; goto out_put_node; } err =3D fwnode_property_read_u32_array(fwnode, propname, propdata, propl= en); if (err < 0) { - dev_err(&psy->dev, "failed to get %s\n", propname); - power_supply_put_battery_info(psy, info); + dev_err(dev, "failed to get %s\n", propname); + __power_supply_put_battery_info(dev, info); goto out_put_node; } =20 @@ -773,9 +796,9 @@ int power_supply_get_battery_info(struct power_supply *= psy, info->ocv_table_size[index] =3D tab_len; =20 info->ocv_table[index] =3D table =3D - devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); + devm_kcalloc(dev, tab_len, sizeof(*table), GFP_KERNEL); if (!info->ocv_table[index]) { - power_supply_put_battery_info(psy, info); + __power_supply_put_battery_info(dev, info); err =3D -ENOMEM; goto out_put_node; } @@ -791,14 +814,14 @@ int power_supply_get_battery_info(struct power_supply= *psy, err =3D 0; goto out_ret_pointer; } else if (proplen < 0 || proplen % 2 !=3D 0) { - power_supply_put_battery_info(psy, info); + __power_supply_put_battery_info(dev, info); err =3D (proplen < 0) ? proplen : -EINVAL; goto out_put_node; } =20 propdata =3D kcalloc(proplen, sizeof(*propdata), GFP_KERNEL); if (!propdata) { - power_supply_put_battery_info(psy, info); + __power_supply_put_battery_info(dev, info); err =3D -ENOMEM; goto out_put_node; } @@ -806,17 +829,17 @@ int power_supply_get_battery_info(struct power_supply= *psy, err =3D fwnode_property_read_u32_array(fwnode, "resistance-temp-table", propdata, proplen); if (err < 0) { - power_supply_put_battery_info(psy, info); + __power_supply_put_battery_info(dev, info); goto out_put_node; } =20 info->resist_table_size =3D proplen / 2; - info->resist_table =3D resist_table =3D devm_kcalloc(&psy->dev, - info->resist_table_size, - sizeof(*resist_table), - GFP_KERNEL); + info->resist_table =3D resist_table =3D devm_kcalloc(dev, + info->resist_table_size, + sizeof(*resist_table), + GFP_KERNEL); if (!info->resist_table) { - power_supply_put_battery_info(psy, info); + __power_supply_put_battery_info(dev, info); err =3D -ENOMEM; goto out_put_node; } @@ -834,22 +857,35 @@ int power_supply_get_battery_info(struct power_supply= *psy, fwnode_handle_put(fwnode); return err; } -EXPORT_SYMBOL_GPL(power_supply_get_battery_info); =20 -void power_supply_put_battery_info(struct power_supply *psy, - struct power_supply_battery_info *info) +int devm_power_supply_get_battery_info(struct device *dev, + struct power_supply_battery_info **info_out) { - int i; + struct fwnode_handle *srcnode =3D dev_fwnode(dev); =20 - for (i =3D 0; i < POWER_SUPPLY_OCV_TEMP_MAX; i++) { - if (info->ocv_table[i]) - devm_kfree(&psy->dev, info->ocv_table[i]); - } + if (!srcnode && dev->parent) + srcnode =3D dev_fwnode(dev->parent); =20 - if (info->resist_table) - devm_kfree(&psy->dev, info->resist_table); + return __power_supply_get_battery_info(dev, srcnode, info_out); +} +EXPORT_SYMBOL_GPL(devm_power_supply_get_battery_info); + +int power_supply_get_battery_info(struct power_supply *psy, + struct power_supply_battery_info **info_out) +{ + struct fwnode_handle *srcnode =3D dev_fwnode(&psy->dev); + + if (!srcnode && psy->dev.parent) + srcnode =3D dev_fwnode(psy->dev.parent); =20 - devm_kfree(&psy->dev, info); + return __power_supply_get_battery_info(&psy->dev, srcnode, info_out); +} +EXPORT_SYMBOL_GPL(power_supply_get_battery_info); + +void power_supply_put_battery_info(struct power_supply *psy, + struct power_supply_battery_info *info) +{ + __power_supply_put_battery_info(&psy->dev, info); } EXPORT_SYMBOL_GPL(power_supply_put_battery_info); =20 @@ -1620,9 +1656,13 @@ __power_supply_register(struct device *parent, * expose battery data to userspace for battery devices. */ if (desc->type =3D=3D POWER_SUPPLY_TYPE_BATTERY) { - rc =3D power_supply_get_battery_info(psy, &psy->battery_info); - if (rc && rc !=3D -ENODEV && rc !=3D -ENOENT) - goto check_supplies_failed; + if (cfg && cfg->battery_info) { + psy->battery_info =3D cfg->battery_info; + } else { + rc =3D power_supply_get_battery_info(psy, &psy->battery_info); + if (rc && rc !=3D -ENODEV && rc !=3D -ENOENT) + goto check_supplies_failed; + } } =20 spin_lock_init(&psy->changed_lock); diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/m= ax17042_battery.h index 6b6e01d3e499..e9f2118e57c8 100644 --- a/include/linux/power/max17042_battery.h +++ b/include/linux/power/max17042_battery.h @@ -24,6 +24,7 @@ #define MAX17042_CHARACTERIZATION_DATA_SIZE 48 =20 #define MAX17055_MODELCFG_REFRESH_BIT BIT(15) +#define MAX17055_MODELCFG_VCHG_BIT BIT(10) =20 enum max17042_register { MAX17042_STATUS =3D 0x00, diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 360ffdf272da..f9fca7bb6e24 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -231,6 +231,7 @@ union power_supply_propval { =20 struct device_node; struct power_supply; +struct power_supply_battery_info; =20 /* Run-time specific power supply configuration */ struct power_supply_config { @@ -239,6 +240,12 @@ struct power_supply_config { /* Driver private data */ void *drv_data; =20 + /* + * Optional pre-parsed battery info for battery supplies. + * The pointed-to data must remain valid for the power supply lifetime. + */ + struct power_supply_battery_info *battery_info; + /* Device specific sysfs attributes */ const struct attribute_group **attr_grp; =20 @@ -814,6 +821,9 @@ extern struct power_supply *power_supply_get_by_referen= ce(struct fwnode_handle * extern struct power_supply *devm_power_supply_get_by_reference( struct device *dev, const char *property); =20 +extern int devm_power_supply_get_battery_info(struct device *dev, + struct power_supply_battery_info **info_out); + extern const enum power_supply_property power_supply_battery_info_properti= es[]; extern const size_t power_supply_battery_info_properties_size; extern int power_supply_get_battery_info(struct power_supply *psy, --=20 2.53.0 From nobody Sun Jun 21 05:19:19 2026 Received: from outbound.mr.icloud.com (p-west2-cluster1-host4-snip4-10.eps.apple.com [57.103.68.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 51B4B3570C8 for ; Mon, 6 Apr 2026 20:58:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.103.68.83 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509124; cv=none; b=JuaReQ8w3qrhZAP1LIr/3qtgZntPebJCnqYtoY2/k90uftxS4AtCFjXYvNmRvVPYoLS4q7IaTJ90vXjLmmzK2Agkf1I+odHYLuMfKQck8JLZxlcPZC/0o+QFhUz/pqZdaAOAZ4S+EbVKdYTz4BwAaQ+ZtRUCnR7SMWlFFJELcGU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775509124; c=relaxed/simple; bh=Zol/c0u8gCjk/y6PHCslM73cSPGCqj/H69tMcdzX81w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=azfBijEPHAFAEQUZGbJWb46dLyp2A2g7O/QfycI9T0b6BVcod0oeC3IELMt1Y6uKdcOIGyXwacdL+tOwDecYxWhXgfyT8GXT5y8ZegxW4OE+ovww6Z/UkJ39bnKIS8w+6/5HAmzbnJOL3o2moUvUeyFgFQefDMFfxnsIJxSqrNs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com; spf=pass smtp.mailfrom=icloud.com; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b=gYcuxApL; arc=none smtp.client-ip=57.103.68.83 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=icloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icloud.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icloud.com header.i=@icloud.com header.b="gYcuxApL" Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPS id 74768180025D; Mon, 06 Apr 2026 20:58:42 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com; s=1a1hai; t=1775509122; x=1778101122; bh=DiS+2JdIdao6qBuf3XG7vMy/ZCz17zV/PBWGg3obMj4=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=gYcuxApL5XT9UcsEzQlE0qeT2g639FkfTq59hivF/Fuq887k8+qH+mUWNro9cF0zPlNIyXfqdDOTUyG/n6stpsTepFuZB7cjcCg2aYLD8LUQZzdzUVvi8XjrKCHtqdsCgxWFugIRGjZz/GOYOmwRnqwyL2vtcd5Alu76k89vXLFLX+evYkzYCIbszcV4m1OXZorlrB3p0IsLG94CZLwz3OzT1qoxggg0Vikudk4081LEXgssejCArdpKQDHhD1PXb5goFgHoU9gCH6PYUZuyJVj4Bx23haxVIGjpOWoKfReYi43HkM9hEU5hGk0TzO+Y8sG1KTRxM6Yb/1Asvw//ug== Received: from bigre.tail98293.ts.net (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-100-percent-3 (Postfix) with ESMTPSA id 4D205180024D; Mon, 06 Apr 2026 20:58:41 +0000 (UTC) From: Vincent Cloutier To: Sebastian Reichel Cc: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Vincent Cloutier Subject: [PATCH v1 9/9] power: supply: max17042_battery: Treat MAX17055 VChg as explicit DT setting Date: Mon, 6 Apr 2026 16:57:57 -0400 Message-ID: <20260406205759.493288-10-vincent.cloutier@icloud.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406205759.493288-1-vincent.cloutier@icloud.com> References: <20260406205759.493288-1-vincent.cloutier@icloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDA2MDIwNiBTYWx0ZWRfX44AxglPu5EJG 6dIMC+9miKSD1VoeXoJX7fFahNYWCI+pA4WX2/lF+jdmlopcWTh3mro380wFyiKsamJH3WG9V2t DkjjAyJXpvSrQshovpPRxkDf3rbyZtdCX1MhvaUacTKozeV/J0HEbHJRLDfKHHeK76gFGuXDw9j ZnzjXpnbXjpif6LTFhY1mqEK0Fk1thaaS8zyxT3C1iTu3jKAu4J9u6j+Y8KJL+uduARmLloLo1g PLQteztx7+d/Jjl3Pxiaaz0QUCcbX+18PMumPPHlNPvgRz/tekooPFgA35fIFDlUPhY4rsbjV/+ PfYrR872FD8h1Y9ueCpAZYRatRTxbIAdSzLjucdF3UJVnFAqGeC7r5NqpPMFLg= X-Proofpoint-ORIG-GUID: GxDoZcNreyMXcwTMtynkmbAwA0XzbhNX X-Proofpoint-GUID: GxDoZcNreyMXcwTMtynkmbAwA0XzbhNX X-Authority-Info-Out: v=2.4 cv=HYgZjyE8 c=1 sm=1 tr=0 ts=69d41e82 cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=x7bEGLp0ZPQA:10 a=5j__JWfIoqoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=f01FELvby5omiHkGd7wA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-06_04,2026-04-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 malwarescore=0 mlxscore=0 clxscore=1015 suspectscore=0 mlxlogscore=846 lowpriorityscore=0 spamscore=0 phishscore=0 adultscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604060206 Content-Type: text/plain; charset="utf-8" From: Vincent Cloutier Handle `voltage-max-design-microvolt` as an explicit `ModelCfg.VChg` setting for MAX17055 so batteries at or below 4.25 V clear the default bit instead of silently keeping it set. Signed-off-by: Vincent Cloutier --- drivers/power/supply/max17042_battery.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index 5bf15c19fc5d..ad6a341b8a4e 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -812,8 +812,13 @@ static inline void max17042_override_por_values(struct= max17042_chip *chip) max17042_override_por(map, MAX17047_V_empty, config->vempty); } =20 - if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055) + if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055) { max17042_override_por(map, MAX17055_ModelCfg, config->model_cfg); + /* VChg is 1 by default, so allow it to be set to 0 */ + regmap_update_bits(map, MAX17055_ModelCfg, + MAX17055_MODELCFG_VCHG_BIT, + config->model_cfg); + } } =20 static int max17042_init_chip(struct max17042_chip *chip) @@ -1039,7 +1044,7 @@ static int max17042_apply_battery_properties(struct m= ax17042_chip *chip, (info->charge_full_design_uah !=3D -EINVAL || info->charge_term_current_ua !=3D -EINVAL)) || (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055 && - info->voltage_max_design_uv > 4250000); + info->voltage_max_design_uv !=3D -EINVAL); if (!needs_config) return 0; =20 @@ -1068,8 +1073,9 @@ static int max17042_apply_battery_properties(struct m= ax17042_chip *chip, } =20 if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055 && - info->voltage_max_design_uv > 4250000) { - chip->config_data->model_cfg =3D MAX17055_MODELCFG_VCHG_BIT; + info->voltage_max_design_uv !=3D -EINVAL) { + if (info->voltage_max_design_uv > 4250000) + chip->config_data->model_cfg =3D MAX17055_MODELCFG_VCHG_BIT; chip->enable_por_init =3D true; } =20 --=20 2.53.0