From nobody Fri Sep 25 23:10:04 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 33DD94FDE55 for ; Mon, 7 Sep 2026 15:01:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793317; cv=none; b=Nh5tcc5wYjBF6IbX3XZEglbBZ6C2eMlwWiX2WWigAaD5fglgoDhQ8/kB0pkQF03oTvClt8jijVdiMJG95I0IbKjvqmHpk5CrQvCeO0aUXLQOZ02jJWCyYqjMC+9kngdETiAEX6f2nrQbqV0+EYKh1gbpqfAk6G1aH7PTTgcCTEE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793317; c=relaxed/simple; bh=fFBFontuCqoa+Ns1VZvMEqJqM1VnbRtNd5ndmJogdRc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FjcXPNNtLEBH6AsUOkO+7sdPyaBAq+VdwT01Nvbwd2LEUmoWX0MpPhkCNyNB2Tvo5wR5ihu208YgotJMqmJST4Ch+7MMDM3wJfaMbcny/vFQxLDkCDcyi2wf7v3xRn3BRwUklV5Aol1xGCEbsXKgLGCOL/lgVLGQUYsgV1vRHP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net; spf=pass smtp.mailfrom=flipper.net; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b=qQn4oRbo; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flipper.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b="qQn4oRbo" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-498028b3d5eso34760725e9.1 for ; Mon, 07 Sep 2026 08:01:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flipper.net; s=google; t=1788793313; x=1789398113; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=4PGZ09ulVNgaF1vpoTSJtIuCw22RVQMsrEgCaeTkLjE=; b=qQn4oRboYesYOvz3J4E1FFV4dFk8s0uZfn5uh79aQTxELllqkvSood3gJ0gQFXBwq2 eiA4GwFbVkPSzxj239uPmaKHmLCs3fxNUeF9tje2u4410zFUpaeB12ui2o7cko/vdERO fZZ0CLXOPYyW3YLebtnLysAxLetzqyykZLl05IoaTIb16pYCajxL9s80f1SEodxZe+gN Ym3ROHRv8j9CvTFxw9ZPsXEWjCUWS2DVYaUbpqaXGJ4OnTy2RHRD617Rb3xi02DDZ165 baIzUOzkhJ3TvRH/DSLCzbpBcaXS/1NG8qwxfWA6vluZxxdYag0C8um3CnnkgN6+XPx7 XyDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788793313; x=1789398113; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=4PGZ09ulVNgaF1vpoTSJtIuCw22RVQMsrEgCaeTkLjE=; b=cqjccPTqcujDMWhP8SvhpbuBNKqcrzyg+qT8LSoqbXc7Iew9EHUzaWaqMLaAb+EagX xIgR6yG+Trt5eo8BpkrblINHKZf0RdHsr1BTr4u3iMsmYJgoAfBq+YZcAOCQWdrm5Et4 9qdua/TwW3g4lDoqjZJxKdo0pV1FOcULBnd/2Uzi02THfqg+ZVq4a9RHgecSlHIKvzy2 9SRr/+j1G+ErF4viTAN9KitviJHCXwT4SePXTMvvvqECJ1imXnzi2YniTH1UhScxmb8i uEG68JCqqizn/yVFiz1PhzVu+jpJH0+bw0ymPMlmMfoGbRowfC0w3CgzDOQmy8QidsuB 4Grw== X-Forwarded-Encrypted: i=1; AKwUvBy/ca34UC1gCGaPnXWW7TbLjJqULi+ZOZ4BCIqWF9R3jgEaYqft3TfyZbR/E1JuvjPktNCIubqQFyKDrBU=@vger.kernel.org X-Gm-Message-State: AFuF++mPPQtRK0/1dm2/mLXrD2O1/g1bpjOkZmswPoyPBcZc1x9snN64 7/Yntzl0gOQD2O6VJ8SElAW8+mxdJE2rijBGCB0sgbHiWz54tcYPxyOt9631qEIHZc4= X-Gm-Gg: AYBFou1O2hJ3eJDa6SdrTFqdQa9rOij42gcSUojpY0mX/crtpsH3EmxNGc2qIt0PGUi z6M01gflObUcEJskDp5YE0ji+whF/5Rw4/hs5Bv/hPUPd9Ynfy2kEjFlIoVXc/lrGVGbf30PKzD +BcxTeQaSb+q7Ku/nwTv24qUtMWF04Tn2fYINhTEuaf96pICvCrUWnRv/+CmnwN0pyml/Urw/ge YGPW1TR+SaN/0T/7Rjm/IkHzhzIrf4RnT0jnyU1H1ucY3pdO7qk9Nu/DOOVBLeUpKCm+HDfVMrf AhZoLt37m4nXyO/Y0xofpkQWc50X9K/noT6QlcO8vUUfWkzDstF6Jr7abnekHvszIbKueHEw99I pDv8qP5tCMrcebs+xSZKlOkyISwv3gXc0Q4+mnXWDp14i3P2GGPYimHIsKmhdqT/HvVPBr9muqL z4bVW+xPyWGxoKQoYPGaNT2ZVKY7nx77k6n3uxJ96SpBUfRnfGRQ18Ft7Day34kb2jCclml64KD F6atlQmmE2p/8UWY10y+prLxsyCvjfGXJ1h0ZR6 X-Received: by 2002:a05:600c:3495:b0:496:c1f3:e8f8 with SMTP id 5b1f17b1804b1-49cf8244bc5mr230429545e9.7.1788793313278; Mon, 07 Sep 2026 08:01:53 -0700 (PDT) Received: from alchark-surface.localdomain (bba-2-51-220-108.alshamil.net.ae. [2.51.220.108]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49cff8195ffsm262992705e9.14.2026.09.07.08.01.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 08:01:53 -0700 (PDT) From: Alexey Charkov Date: Mon, 07 Sep 2026 19:01:41 +0400 Subject: [PATCH 1/5] power: supply: core: prevent unregistering a power supply while a callback runs 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 Message-Id: <20260907-bq257xx-init-v1-1-1a08b29e1a68@flipper.net> References: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> In-Reply-To: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> To: Sebastian Reichel , Lee Jones , Chris Morgan , Pavel Machek , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz Cc: Sebastian Reichel , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Alexey Charkov X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7016; i=alchark@flipper.net; h=from:subject:message-id; bh=fFBFontuCqoa+Ns1VZvMEqJqM1VnbRtNd5ndmJogdRc=; b=owGbwMvMwCW2adGNfoHIK0sZT6slMWTNu3jng3XwjD2LDMx/ZTTHrOC3nPd+mZ7WwzqNli1xa +psfv5W6JjIwiDGxWAppsgy99sS26lGfLN2eXh8hZnDygQyRFqkgQEIWBj4chPzSo10jPRMtQ31 DI10jHWMGLg4BWCqV9cyMqxv5dp6b2Xthl+SOfdmeOgpp+7erXrMgluna+/pV563d+1n+Ke8MmF CsNn+QtapDH7GXzdmd+ZE1j7ccyXPcZ+90Kabb1gA X-Developer-Key: i=alchark@flipper.net; a=openpgp; fpr=9DF6A43D95320E9ABA4848F5B2A2D88F1059D4A5 Once a power supply is registered, its callbacks can immediately start firing from other contexts, such as external_power_changed() triggered by the TCPM stack. If a power supply is unregistered while the callback is still running, the driver data can already be freed when the callback tries to access it, leading to a use-after-free. This happens e.g. when the hardware bus carrying the power supply device malfunctions (e.g. I2C is hogged down by another malfunctioning device) immediately after the power supply is registered, and thus the core is still processing the callbacks which were queued up when the driver starts the removal, leading in some cases to a kernel crash, e.g.: [ 11.645942] Unable to handle kernel NULL pointer dereference at virtual = address 0000000000000005 [ 11.646751] Mem abort info: [ 11.647006] ESR =3D 0x0000000096000004 [ 11.647338] EC =3D 0x25: DABT (current EL), IL =3D 32 bits [ 11.647806] SET =3D 0, FnV =3D 0 [ 11.648077] EA =3D 0, S1PTW =3D 0 [ 11.648356] FSC =3D 0x04: level 0 translation fault [ 11.648785] Data abort info: [ 11.649041] ISV =3D 0, ISS =3D 0x00000004, ISS2 =3D 0x00000000 [ 11.649524] CM =3D 0, WnR =3D 0, TnD =3D 0, TagAccess =3D 0 [ 11.649981] GCS =3D 0, Overlay =3D 0, DirtyBit =3D 0 [ 11.650390] [0000000000000005] user address but active_mm is swapper [ 11.650955] Internal error: Oops: 0000000096000004 [#1] SMP [ 11.651460] Modules linked in: [ 11.651742] CPU: 1 UID: 0 PID: 144 Comm: kworker/1:2 Not tainted 7.2.0-r= c6-g62a9297af2cd #1 PREEMPT [ 11.652553] Hardware name: Flipper One rev. F0B1C2 (DT) [ 11.653024] Workqueue: events power_supply_changed_work [ 11.653511] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE= =3D--) [ 11.654135] pc : __power_supply_is_supplied_by+0x18/0x100 [ 11.654624] lr : __power_supply_am_i_supplied+0x40/0xb8 [ 11.655098] sp : ffff80008192bb30 [ 11.655399] x29: ffff80008192bb30 x28: 0000000000000000 x27: 00000000000= 00000 [ 11.656049] x26: 0000000000000000 x25: 0000000000000000 x24: 00000000000= 00000 [ 11.656695] x23: ffff0000c19f4200 x22: ffffdb2232ba4ea8 x21: ffff8000819= 2bc28 [ 11.657344] x20: ffff0000c1eef000 x19: ffff80008192bc18 x18: 00000000a08= 86e62 [ 11.657991] x17: 000000040044ffff x16: 04500072b5503510 x15: 00000000000= 00000 [ 11.658639] x14: 0000000000000000 x13: 0000000000000220 x12: 00000000000= 00000 [ 11.659286] x11: 0000000000000000 x10: ffff0000c1fdb2b0 x9 : ffffdb2232b= a5590 [ 11.659934] x8 : 00000000e5b906e6 x7 : ffff0000c2502778 x6 : ffffdb22339= 793d0 [ 11.660581] x5 : ffff80008192bc18 x4 : ffff0000c19cbca0 x3 : 00000000000= 00000 [ 11.661228] x2 : ffff0000c1fdaf40 x1 : ffffffffffffffed x0 : ffff0000c1e= ef000 [ 11.661878] Call trace: [ 11.662103] __power_supply_is_supplied_by+0x18/0x100 (P) [ 11.662596] __power_supply_am_i_supplied+0x40/0xb8 [ 11.663040] psy_for_each_psy_cb+0x20/0x40 [ 11.663416] class_for_each_device+0x110/0x150 [ 11.663825] power_supply_am_i_supplied+0x68/0x100 [ 11.664262] bq257xx_external_power_changed+0x58/0x140 [ 11.664733] __power_supply_changed_work+0x60/0x80 [ 11.665170] psy_for_each_psy_cb+0x20/0x40 [ 11.665545] class_for_each_device+0x110/0x150 [ 11.665953] power_supply_changed_work+0x98/0x1b8 [ 11.666382] process_one_work+0x164/0x4c0 [ 11.666758] worker_thread+0x19c/0x320 [ 11.667104] kthread+0x138/0x150 [ 11.667408] ret_from_fork+0x10/0x20 [ 11.667744] Code: d503233f a9bd7bfd 910003fd a90153f3 (f9400c34) [ 11.668294] ---[ end trace 0000000000000000 ]--- Add a read-write semaphore between external_power_changed() and power_supply_unregister() to prevent the latter from returning (and thus the driver from freeing its data) while the callback is still running. Fixes: bc1540561c9e ("power_supply: Add API for safe access of power supply= function attrs") Signed-off-by: Alexey Charkov --- drivers/power/supply/power_supply_core.c | 26 ++++++++++++++++++++++++-- include/linux/power_supply.h | 9 +++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/suppl= y/power_supply_core.c index 00d8bc98d588..83769fc33575 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -1526,8 +1526,19 @@ int power_supply_property_is_writeable(struct power_= supply *psy, =20 void power_supply_external_power_changed(struct power_supply *psy) { - if (atomic_read(&psy->use_cnt) <=3D 0 || - !psy->desc->external_power_changed) + if (!psy->desc->external_power_changed) + return; + + /* + * Keep power_supply_unregister() from returning, and thus from letting + * the driver's data be freed, while the callback is running. The + * use_cnt check has to happen under the lock as well: on its own it + * only tells us the supply was registered when we looked, not that it + * still is by the time the callback dereferences its driver data. + */ + guard(rwsem_read)(&psy->epc_sem); + + if (atomic_read(&psy->use_cnt) <=3D 0) return; =20 psy->desc->external_power_changed(psy); @@ -1774,6 +1785,7 @@ __power_supply_register(struct device *parent, } =20 spin_lock_init(&psy->changed_lock); + init_rwsem(&psy->epc_sem); init_rwsem(&psy->extensions_sem); INIT_LIST_HEAD(&psy->extensions); =20 @@ -1915,6 +1927,16 @@ void power_supply_unregister(struct power_supply *ps= y) { WARN_ON(atomic_dec_return(&psy->use_cnt)); psy->removing =3D true; + + /* + * use_cnt is now zero, so no new ->external_power_changed() call can + * start. Wait for one that is already running: it may be a *supplier's* + * changed_work, which cancel_work_sync() below does not cover, and it + * may still dereference driver data that the caller is about to free. + */ + down_write(&psy->epc_sem); + up_write(&psy->epc_sem); + cancel_work_sync(&psy->changed_work); cancel_delayed_work_sync(&psy->deferred_register_work); sysfs_remove_link(&psy->dev.kobj, "powers"); diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index e749d2189335..6a8c4b140a9c 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -351,6 +351,15 @@ struct power_supply { bool removing; atomic_t use_cnt; struct power_supply_battery_info *battery_info; + /* + * Held for read while ->external_power_changed() runs, and for write by + * power_supply_unregister() so that it waits for an in-flight callback + * to finish. Without this a driver's data, typically devm-allocated on + * its own device, can be freed while the callback is still using it. + * Must not be shared with extensions_sem: callbacks may read their own + * properties, which takes that one for read. + */ + struct rw_semaphore epc_sem; struct rw_semaphore extensions_sem; /* protects "extensions" */ struct list_head extensions; #ifdef CONFIG_THERMAL --=20 2.54.0 From nobody Fri Sep 25 23:10:04 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC921471265 for ; Mon, 7 Sep 2026 15:01:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793319; cv=none; b=R2dws4Bv1HyQF6yDZXYlKifGO6EhtK4Bvft3zxS2/2FLwtDoE+00F7nHF88poCOHY/oQwtvBnAPn955IG37M6erHImCRwN78/Nay2LkgT20eqFZwb5Ke2TDFZhOSWJpA4cSoO6YKj2y2i/g/Y3WxmXqmX5wVUzm+wUWFWV0DK4g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793319; c=relaxed/simple; bh=yP9RfVxzD8mok6o8UT0hT5i3xCcDqcxVYHZ0/CWI8CE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bhGDAsIOMqpaWO0gf++h6uVI3PbtwuaDqAGuQjpMsTqQ3GfQ7W3ESog+mRoZf8f0LPb6ig1D3zTbWT6xJfMBhOO6fWnQQ6OvGSJxdnl6iWUCag+JzLRIhMec4LNICp/W3NDKj6KtgVt179XHiUeQxpwdZOLJyVW9i2CnGlJTSzg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net; spf=pass smtp.mailfrom=flipper.net; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b=1XTWX0bR; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flipper.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b="1XTWX0bR" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-499b2981a7bso39095615e9.3 for ; Mon, 07 Sep 2026 08:01:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flipper.net; s=google; t=1788793316; x=1789398116; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cc/EAEQUnK6X7K+MUTGqGFOOzMk/azBNDSYL0Jyzjpg=; b=1XTWX0bRxoY5JBfXvG8h1zF0SSeaO2WTjOXNiZeBF70C0uAuTe/X569S/MhOgnEdbW uKH4VzLtMPuHrRZgnsBfU/0cBY7JBz7bxIQjN2KuzkfFQC/lQs+7yBIXmIPDyPK3LB3X 6Lz6O28WSl5/0fEQOF1MY4Yd+vXkJarpgLzqG/e2OoAQQonvn9S0I9+JFT/L0qMnABAl u1fzgwmSZDuMfzaHx90/qhTBdWp7WjLRppL/h9krP0D7l8eIHyBInKi7ssMDlIb79pB/ pVC74VgtV03g+nK4p+mbU2Rl9K/j5W+89I2DBqHUrdkLH6w87w48GN29ZZA5UBbp6dBD jUTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788793316; x=1789398116; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=cc/EAEQUnK6X7K+MUTGqGFOOzMk/azBNDSYL0Jyzjpg=; b=IL82iEvsNxWtMui7o/tIYUekikIEAlT9ZEImVZ8ETnjWDFW1gdYLijej4LUk+9xogJ PEVs21voTfaaKMMB7kceBA4RRQH61674LVFQ/434TtPalcic9dJ1gN9wyCzxUIGYHH7b EAukiDfUnwDH2VZRzrdIul1Kmn3nCaG0fvaup2uGzSMxDNkpBk5LUALwxwg1Jigw890i ToGZvbwSzFXwIKfQzw0vzlLDxD6xjliIYIN4lc6GTRwWMIwHRK/YtsWUIqEM3VtHmcvH LGB8niYwrU7VUptPAECqqKVb0HvHlILwiNf34gEwBNcZoyMi69+V0SmVjDmqZWMnhw26 yoWA== X-Forwarded-Encrypted: i=1; AKwUvBwgPsfg+IwXGlZlVa/CS8r7jjHTR21BHNpNdyzgPpc0h0b2EGWWTtgycMKjR03r3OKuPQ9MBr0ETWz1B4M=@vger.kernel.org X-Gm-Message-State: AFuF++ndGxT0/v6Ci+eIAsQX3dqC+0kO9gKo+Ay8V/+5i5mceZcN9aq9 jWjvrVVVh07iB1J/QMFzXpoxqu+mdlX4kfClie2gNU055EqE3dJum0XZJdb58d275q4= X-Gm-Gg: AYBFou3fQ25uobuNwZLPxBtqXLQHDW1NaqYgW6jvwzIk4suRvMLtFcnAzYWRCKHqcTf rlCvR2860w/1RoKd2lQe6k788IDcodeULU5n+4nzCoR8uarwuHMlrJRoHVwPDiZkLQZ/bmh1iXB AxTGxHKqdt/UsWlJTE40R0hHYkhp6iQG0nICiwkpMq1z4+7MNoKVgt9fLYxfJ6txnGIBgjVsIaZ bF4o7bjmJDHMlzLYxI0JxZmXkWrIH77NukDfb6XgBFniypqP2uQY9Yb6sAAG/na8P4UrX8zmxcg cWQPsAZBmF65Pqt/LlMgyAXTp+LSEPqE3pQTniqrrn8DH5VKJVHVnDduNU20FZNd1MSAL2NhadK BCtmJUBH9Oaa+rPSah/JwOAPK0TPiXMNfnkxS3NrTHyevKNYuwkvVr37/BdwTMbExyBfDhShylu fK18t0yIbMTPEj8ewW5C50SMlbqjvd3cQ956TfQiuVBG++Bz7OEERRes2Nkf4Ptkto3M+qnSCEE 28FIucu57c6ugfe2sp9250N+5qh5zB8ry2pRbCp X-Received: by 2002:a05:600c:1990:b0:49c:f512:2361 with SMTP id 5b1f17b1804b1-49cf82524a2mr348015055e9.14.1788793315751; Mon, 07 Sep 2026 08:01:55 -0700 (PDT) Received: from alchark-surface.localdomain (bba-2-51-220-108.alshamil.net.ae. [2.51.220.108]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49cff8195ffsm262992705e9.14.2026.09.07.08.01.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 08:01:55 -0700 (PDT) From: Alexey Charkov Date: Mon, 07 Sep 2026 19:01:42 +0400 Subject: [PATCH 2/5] power: supply: core: Allow getting battery info before psy is registered 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 Message-Id: <20260907-bq257xx-init-v1-2-1a08b29e1a68@flipper.net> References: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> In-Reply-To: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> To: Sebastian Reichel , Lee Jones , Chris Morgan , Pavel Machek , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz Cc: Sebastian Reichel , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Alexey Charkov X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=10290; i=alchark@flipper.net; h=from:subject:message-id; bh=yP9RfVxzD8mok6o8UT0hT5i3xCcDqcxVYHZ0/CWI8CE=; b=kA0DAAoWsqLYjxBZ1KUByyZiAGqe0dyigbVIvbl5zZsiMDd32BxIu8uPObWbHxiDQzYGa6MH0 4iRBAAWCgA5FiEEnfakPZUyDpq6SEj1sqLYjxBZ1KUFAmqe0dwbFIAAAAAABAAObWFudTIsMi41 KzEuMTIsMywyAAoJELKi2I8QWdSlIhIA/iBckGczH19zVds8L5SXN35KiYZiOKoqgTiy8aWdBvI nAP9/vcBlHdtAfLfXF84QBQej6uGziahHEGBKftfEwvxxBA== X-Developer-Key: i=alchark@flipper.net; a=openpgp; fpr=9DF6A43D95320E9ABA4848F5B2A2D88F1059D4A5 Some power supplies, such as battery chargers, may need to program the device parameters based on what their connected battery allows. Current API requires registering the power supply to access battery information, which is problematic because a registered power supply is immediately available to the rest of the system, but the battery parameters may not be set yet in the charger. Given that the battery info helpers really only need a fwnode and a struct device to hang devres-allocated resourses on, add a pure dev-based get/put API alongside the existing psy-based one, which can be used to query the battery information before registering the power supply. Signed-off-by: Alexey Charkov --- drivers/power/supply/power_supply_core.c | 102 ++++++++++++++++++++++-----= ---- include/linux/power_supply.h | 4 ++ 2 files changed, 77 insertions(+), 29 deletions(-) diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/suppl= y/power_supply_core.c index 83769fc33575..855c89f712e8 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -725,21 +725,18 @@ 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 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); - fwnode =3D fwnode_find_reference(srcnode, "monitored-battery", 0); if (IS_ERR(fwnode)) return PTR_ERR(fwnode); @@ -750,7 +747,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) @@ -765,7 +762,7 @@ 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; @@ -826,7 +823,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", @@ -877,7 +874,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) { @@ -892,28 +889,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_from_dev(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_from_dev(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_from_dev(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_from_dev(dev, info); goto out_put_node; } =20 @@ -921,9 +918,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_from_dev(dev, info); err =3D -ENOMEM; goto out_put_node; } @@ -939,14 +936,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_from_dev(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_from_dev(dev, info); err =3D -ENOMEM; goto out_put_node; } @@ -954,17 +951,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_from_dev(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 =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_from_dev(dev, info); err =3D -ENOMEM; goto out_put_node; } @@ -982,22 +979,69 @@ int power_supply_get_battery_info(struct power_supply= *psy, fwnode_handle_put(fwnode); return err; } + +int power_supply_get_battery_info(struct power_supply *psy, + struct power_supply_battery_info **info_out) +{ + struct fwnode_handle *srcnode; + + srcnode =3D dev_fwnode(&psy->dev); + if (!srcnode && psy->dev.parent) + srcnode =3D dev_fwnode(psy->dev.parent); + + return __power_supply_get_battery_info(&psy->dev, srcnode, info_out); +} 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) +/** + * power_supply_get_battery_info_from_dev() - Get battery info without a s= upply + * @dev: Device holding the "monitored-battery" reference, which also owns= the + * devres allocations made for the returned info + * @info_out: Pointer to store the resulting battery info + * + * Same as power_supply_get_battery_info(), but keyed off a plain device r= ather + * than a registered power supply. Chargers that program hardware limits t= aken + * from the battery node need those values *before* they can safely regist= er + * their power supply: registering makes the supply callable, so a later p= robe + * failure would free driver data underneath a running callback. + * + * Release the result with power_supply_put_battery_info_from_dev(). + * + * Return: 0 on success or an error code on failure. + */ +int power_supply_get_battery_info_from_dev(struct device *dev, + struct power_supply_battery_info **info_out) +{ + return __power_supply_get_battery_info(dev, dev_fwnode(dev), info_out); +} +EXPORT_SYMBOL_GPL(power_supply_get_battery_info_from_dev); + +/** + * power_supply_put_battery_info_from_dev() - Release battery info + * @dev: Device passed to power_supply_get_battery_info_from_dev() + * @info: Battery info to release + */ +void power_supply_put_battery_info_from_dev(struct device *dev, + struct power_supply_battery_info *info) { int i; =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]); + devm_kfree(dev, info->ocv_table[i]); } =20 if (info->resist_table) - devm_kfree(&psy->dev, info->resist_table); + devm_kfree(dev, info->resist_table); + + devm_kfree(dev, info); +} +EXPORT_SYMBOL_GPL(power_supply_put_battery_info_from_dev); =20 - devm_kfree(&psy->dev, info); +void power_supply_put_battery_info(struct power_supply *psy, + struct power_supply_battery_info *info) +{ + power_supply_put_battery_info_from_dev(&psy->dev, info); } EXPORT_SYMBOL_GPL(power_supply_put_battery_info); =20 diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 6a8c4b140a9c..8a999a18c843 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -864,6 +864,10 @@ extern int power_supply_get_battery_info(struct power_= supply *psy, struct power_supply_battery_info **info_out); extern void power_supply_put_battery_info(struct power_supply *psy, struct power_supply_battery_info *info); +extern int power_supply_get_battery_info_from_dev(struct device *dev, + struct power_supply_battery_info **info_out); +extern void power_supply_put_battery_info_from_dev(struct device *dev, + struct power_supply_battery_info *info); extern bool power_supply_battery_info_has_prop(struct power_supply_battery= _info *info, enum power_supply_property psp); extern int power_supply_battery_info_get_prop(struct power_supply_battery_= info *info, --=20 2.54.0 From nobody Fri Sep 25 23:10:04 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0DAC4CA29E for ; Mon, 7 Sep 2026 15:01:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793321; cv=none; b=P9qyEblxp+U1N7UoSdQisNvKTelo+934vbt0RFhPqM0vh2AIHPhsVCdzQKEHWvKWWhBQ8A/Q+x72SYsXPaqX7cI1IDmZ5LXm+blnNDd7VOWebS7HVK6YoTgWCkmroyvatvIl6iDLLDwTlXLOYa0O658pVT/p10tTrRPBAHflsd0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793321; c=relaxed/simple; bh=Syd1CsliuYmu+ANgqBVu0Kp8guejtms1xDp6WywGR3Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gv4b+nVnsBja7F8U0xxfgTak7qSGu2GA+5NSRltj7GyH1OIXcmOniipUqge+sHymRcAd7Sbin1DbEfkGKoac+m2H8Zldrd16WFS8m24CjkuOpmngu4rjk6rsZtj/Azn88M0neITSWkl5j7nwNYnHiXt+T0N7SJrqgQXwe85HJM4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net; spf=pass smtp.mailfrom=flipper.net; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b=heKGsHU/; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flipper.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b="heKGsHU/" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-495590dde14so52687945e9.0 for ; Mon, 07 Sep 2026 08:01:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flipper.net; s=google; t=1788793318; x=1789398118; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=aPjbELwZRYUgyLIzGjZcllHabaclbxb6J9sI4fKFQHE=; b=heKGsHU/GofJUtxJbwsvdiLcBKii74cvb90HHHPpJfKT9GPwVhwlgkBX3UEBDxiEXd vugL4ug3CsEwbTyBvioEf5198TYUus6txz0UHVB4fep2b2padSpEysLy4+ZLrzZn9+oE tbYjyUrndhW0VnInI3xqNLfMjsvVArwg2j6mNYamIJxRlEHTG/wa3svc5AYUcaHeQgvG 2ffxpnXxfkbzNIL0d6PJT68/x0AHDXVer7/B4VXcpGoTvuwyYBmXZmlRFCto0t/cw3n5 +d8FS/P0eaQSc7sO27rFhu0+KCmDWCeYp5r7dJzPe9eTeq3kwrFFWAi+XLhAAFg3/fEC OGww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788793318; x=1789398118; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=aPjbELwZRYUgyLIzGjZcllHabaclbxb6J9sI4fKFQHE=; b=Ha2LdBh1z8hjkZiyJYyEwiCKffLya6GP1o2WwxNyVyAU/3iGkNgehCGbEgrrfiNsHf aOmluZlY2iyq51Zh6HMQk2e6nutuzT/GV+oxIVJI14NQGhYTmSVF7rHGloG2PP1Vyyh+ EO3wexG3Hf3y5597n0O4ZA0TOAxzmDShbHbPZf84njtJdjB/2JMH6wQD1ouwhbThugw6 SaGfUEPUw+8xdb/+XAEyaTJ63S/KJGvCOmIArJAoq1gDEZKaIgyKRe2+T+JVgL09RPah KJZR2TQRgFKaABEJhCYJz3LFC9ML0J/IO9e98iTSKOdDqjya85DgqaF4QgW55mN8a/IK OMLA== X-Forwarded-Encrypted: i=1; AKwUvBy4uf8yO7sW+Trr49Tp4GNa7LNPtE0vpsYvPiS1NzM/sG11uQfwbw6DmNppHscv3ZYY9naS3B+w2C7vapA=@vger.kernel.org X-Gm-Message-State: AFuF++lBHmAMUYXRQ5CNFPvskU10Ba2BbEUr9p1zjWeDgCxPJ0wvQfwY S1NBQ0noPqN3DRKYr3/QkqIotjzie164ysSHWzr+AtUiVu1izDvMgaIztbmaF8LFMjg= X-Gm-Gg: AYBFou0pyMsY8qZBUaM/a2JPqnI8Qv2B3UneqaGbrzCTKusFWVhY7HpzTCJBbB5mTqM PlO0SCRrUAdj41pP0ar+Q+Qybr/t4yaXVFdKukiTuTZhK5FjZpRYgBTiNfCB9BSDhH4050WbdUW 1lERqlt7YVmnYA7RU91zr2j/LCZBd3gOQRhXpZ93Zym+oPdPI6aj8KfZQG9WDAu7PMEzqGvk7Fk OE5CZxiVuZcAYGYJH27CTcpQlWq+83fRzrqKorRZDIQNFu6sCeyPzQOBVeoeM7qiQN2iP7ipfug UBZXWQnVpcnCo4Mw6jwlNpr41DQr1cN9m43sUeB2QK2zAbknszmU4wBeaF8GMIdAX3t8KRQLttX 4eDZTS8wENmGGbswv7dZ/ZcYIx+yeNzwXr3fWLleWF+FCp+GBcnTn43Jt6KhrVkZlgkjwc4TvHu KTSjMBUJdUDh0ZNWhzi62D0flYRNJi1fMysWVJlsD4zAcRWc3gBtDoZROef+8S39DAAIk1VUi5A CdS0jwsAxpuCnRLQnBz+DF6PNOWtn4kWguCRUdR X-Received: by 2002:a05:600c:860b:b0:49c:ee20:e787 with SMTP id 5b1f17b1804b1-49cf7fe62e9mr480695025e9.1.1788793317919; Mon, 07 Sep 2026 08:01:57 -0700 (PDT) Received: from alchark-surface.localdomain (bba-2-51-220-108.alshamil.net.ae. [2.51.220.108]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49cff8195ffsm262992705e9.14.2026.09.07.08.01.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 08:01:57 -0700 (PDT) From: Alexey Charkov Date: Mon, 07 Sep 2026 19:01:43 +0400 Subject: [PATCH 3/5] power: supply: bq257xx: Don't ignore errors from bq257xx_get_state() 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 Message-Id: <20260907-bq257xx-init-v1-3-1a08b29e1a68@flipper.net> References: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> In-Reply-To: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> To: Sebastian Reichel , Lee Jones , Chris Morgan , Pavel Machek , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz Cc: Sebastian Reichel , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Alexey Charkov X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1072; i=alchark@flipper.net; h=from:subject:message-id; bh=Syd1CsliuYmu+ANgqBVu0Kp8guejtms1xDp6WywGR3Q=; b=owGbwMvMwCW2adGNfoHIK0sZT6slMWTNu3hH9mL2fIv7z426a7cwddof+Pl9oml6+YRI16V90 7bwMcwz6ZjIwiDGxWAppsgy99sS26lGfLN2eXh8hZnDygQyRFqkgQEIWBj4chPzSo10jPRMtQ31 DI10jHWMGLg4BWCqA94w/FPhE4/6X324IXDx8R43qyc+S82nKcxWm5fz+MIjty2J3toM/12knh0 z2/d937zTmvGXltsm3GR4y/p+W6Ku4elrq5hWOjEAAA== X-Developer-Key: i=alchark@flipper.net; a=openpgp; fpr=9DF6A43D95320E9ABA4848F5B2A2D88F1059D4A5 The callback function bq257xx_get_state() can return an error code when its regmap access fails, but its caller bq257xx_external_power_changed() was ignoring those. Return early on errors and propagate the error code to the caller. Fixes: 1cc017b7f9c7 ("power: supply: bq257xx: Add support for BQ257XX charg= er") Signed-off-by: Alexey Charkov --- drivers/power/supply/bq257xx_charger.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/bq257xx_charger.c b/drivers/power/supply/= bq257xx_charger.c index b735bb02a8e0..355c59f0bbfb 100644 --- a/drivers/power/supply/bq257xx_charger.c +++ b/drivers/power/supply/bq257xx_charger.c @@ -1053,7 +1053,9 @@ static void bq257xx_external_power_changed(struct pow= er_supply *psy) int ret; int imax =3D pdata->iindpm_max; =20 - pdata->chip->bq257xx_get_state(pdata); + ret =3D pdata->chip->bq257xx_get_state(pdata); + if (ret) + return; =20 pdata->supplied =3D power_supply_am_i_supplied(pdata->charger); if (pdata->supplied < 0) --=20 2.54.0 From nobody Fri Sep 25 23:10:04 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A29F375F6C for ; Mon, 7 Sep 2026 15:02:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793323; cv=none; b=LWP5affr2clwAmJiSvBg8q2ykg+I/+oG7nMfQOclnezLOLZpcP/n7u6JuDzJVMViqopkZSDYb50+3/jJO1XQADkKDbo+vg72WrUXgU4k6GU0w8H4aBGdhL/Clf6zqq1+NHmcFuLBtQlk1Y1w3lrvxHarzrbO/2pLo1yvb/nINyw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793323; c=relaxed/simple; bh=/Lj1bzOltbe0TShD0ZkZdsIYxLxj5M1uJ4RcZYV70+g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KFv2KIHIOt8DzZDgba45iYu0nr8dFv4XtNsr6qEHWaESZFFkV4DStEmvs2OjDnqfhVUG3bM5lgP925QWMcTgvJD1+D4hqbE2uHRK7A3L16DVi76H8Ck6RNI84oVQCQ6cDjPotsaIizI4Oy33h44QXvx4BjK9AI4GjVusEIsME8Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net; spf=pass smtp.mailfrom=flipper.net; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b=aXZHTEed; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flipper.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b="aXZHTEed" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-49b965570d7so43257305e9.0 for ; Mon, 07 Sep 2026 08:02:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flipper.net; s=google; t=1788793320; x=1789398120; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ELIdnmZ186QZy3GeHErz5sisEfjYu32lHLlVPnyugFw=; b=aXZHTEed04Re1d8cB2ZCRcY75cIJ6nlxnqHHtxOoP7em1W6t8+cVAkx4ejrEn9KXee jk2tkHOzbjyo1pjAeQv6gzlpBRst41UEsFonCcooRZ4YRy7mpazaTvv4HGfwCTY/fDh/ dNvW02SaYxQmlH9P5pE1Sepk3p19YlSYdiIRBhS/tbXPnXfXZFH9kMC8TAzqJ00pSB4Y gGcytUzWkNNrYl5aQseY59hGmwhNWpJGUC5j773LqCiF4568Y7P8NKAv6WauvWxkJyu/ nwaGxPtr4G+PPoCX/C874FuoKqLw2cSii30uh+l261tD/wy3zeRna/jM23SF89UenG2K k2Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788793320; x=1789398120; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=ELIdnmZ186QZy3GeHErz5sisEfjYu32lHLlVPnyugFw=; b=QTg10egwS16pV0414vceQ6YVKrfVvNnO1kKSV1WyVlqj+ThgXlfxKZJWxeY4bD/jL1 MxwR3+IPng9+vxoVgsH5I7Oee5SHkz4DsFmEaCj6QrjrJC28fF8QHXpUw4PllMrqXTMQ n6yrjCgT1juOupoEPyttW8RXJpTdZHA9fjtTAjnUgAyAGhvcMCzVG0kXTh6dLe2KGfdt 47pwhzpkEqY8ITJNDRsC0s2L6tXhrWb8BaE+enMrX9F4UI0QdhdL0Xz4SAELq3GhZXFO 1vL6ahmLHFfR1S5f9PKbzAfUWm748pIYx2UU64sGosHRuXQP6h+Y0PU/hdBx9ymFvheW QtvQ== X-Forwarded-Encrypted: i=1; AKwUvByJPhO+jWPQ+L8aDVexjsd+jMN1sxlDQOaRFAoJC/Gv0Z8lhu4yzR2HNhLWzvqyFSdG2teJcU345z0v6KI=@vger.kernel.org X-Gm-Message-State: AFuF++mr4rvuFFZ2BdTsxkaQENjG7sd2pPDeHR2wTxkUeN0NEHHt1pUV g9Py51z4yqfz6C+amobct+sMyS6K5D5nAfrqgMsFTjhRcPA+dpySJG48WVkLj6Jw/oE= X-Gm-Gg: AYBFou1vClufjDuHgd78AFDTxlSyqjLLNbaaEo/K1SkSzzTHgTdOswax5K4BZiq5+5y 7Z0sVOY8rZeNW1PmdFEyqJJd63a/Q7AP6dme4QbyG9nyCx9IU/jwplTJYqMiGxEfhtKYl4ss5Y8 CS+pD5JTJs5FaPm8iYD86jM/DELb590JPnygRilpuUs7q02Y1HIt2UEr/tvr1OeA+pdTPfVv97b PPYd27MKEsKKbFnnclpo7SuD13YkNDcO4DOo26lC1yQKZvjoYca9UAmetZpbi7rkbZRlOmWrgEo 3mdOzl4JmXBVhM/2K1PIfrgR+cNygQKPIEaH/9GiIHQyvkk62jvxFhmjz/Z05lY1O3yMH4S7iIu SWLw5KP2Yd44STT+dPEr/X823wvZiZjAGGpXHDrwNpVU7Y5hjXA8hq5YsIcciROhhFLba5A1kLy FMza9tNeSqw4tWcMZ3zBJYbZ8MIejdi5MNE1aBsS+7UP5LwSSCLje/azuO8NiwCb4KkNvUzoH7y Ae4yyU6X3QU6CQp5wn+UVkxaffAXYOKj5TQ06bX X-Received: by 2002:a05:600c:34c9:b0:49c:f729:d757 with SMTP id 5b1f17b1804b1-49cf824f757mr233492835e9.11.1788793320085; Mon, 07 Sep 2026 08:02:00 -0700 (PDT) Received: from alchark-surface.localdomain (bba-2-51-220-108.alshamil.net.ae. [2.51.220.108]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49cff8195ffsm262992705e9.14.2026.09.07.08.01.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 08:01:59 -0700 (PDT) From: Alexey Charkov Date: Mon, 07 Sep 2026 19:01:44 +0400 Subject: [PATCH 4/5] power: supply: bq257xx: Use psy directly instead of driver data 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 Message-Id: <20260907-bq257xx-init-v1-4-1a08b29e1a68@flipper.net> References: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> In-Reply-To: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> To: Sebastian Reichel , Lee Jones , Chris Morgan , Pavel Machek , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz Cc: Sebastian Reichel , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Alexey Charkov X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=960; i=alchark@flipper.net; h=from:subject:message-id; bh=/Lj1bzOltbe0TShD0ZkZdsIYxLxj5M1uJ4RcZYV70+g=; b=owGbwMvMwCW2adGNfoHIK0sZT6slMWTNu3jn2Nc7fM5/J89eXTJh/uQb3y6U1bstmyLNc6lAv CvPokRuasdEFgYxLgZLMUWWud+W2E414pu1y8PjK8wcViaQIdIiDQxAwMLAl5uYV2qkY6Rnqm2o Z2ikY6xjxMDFKQBTXfaD4X/Otd6I3cs03FpXnbFWctA30jhQUXXT8bPfLdNHbLnJPjMY/kfXpvV pTfGojKh8YyLU0MB7O/nlPAW7rQaHbtr6Mq/yZQYA X-Developer-Key: i=alchark@flipper.net; a=openpgp; fpr=9DF6A43D95320E9ABA4848F5B2A2D88F1059D4A5 Improve consistency in the bq257xx_external_power_changed() function by using the psy pointer directly instead of dereferencing the driver data. This makes all power_supply_*() calls follow the same pattern instead of power_supply_am_i_supplied() standing out for no reason. Signed-off-by: Alexey Charkov --- drivers/power/supply/bq257xx_charger.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/power/supply/bq257xx_charger.c b/drivers/power/supply/= bq257xx_charger.c index 355c59f0bbfb..8a645859460b 100644 --- a/drivers/power/supply/bq257xx_charger.c +++ b/drivers/power/supply/bq257xx_charger.c @@ -1057,7 +1057,7 @@ static void bq257xx_external_power_changed(struct pow= er_supply *psy) if (ret) return; =20 - pdata->supplied =3D power_supply_am_i_supplied(pdata->charger); + pdata->supplied =3D power_supply_am_i_supplied(psy); if (pdata->supplied < 0) return; =20 --=20 2.54.0 From nobody Fri Sep 25 23:10:05 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C3C05013B2 for ; Mon, 7 Sep 2026 15:02:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793326; cv=none; b=j6DNJ88QTTta3avoGche1zpU49MLwOQUBTQgpP8nMbWB0AExUcroiH41TKPeBvnbzKAeeldKeYrbDEwuoDHAVFSRdgy/Tk91kTLW9ryGbdkWcF5YjGMcpeFniEbfSLg1V4gK9oBDnqG4A/Wg6DI06QGlrY41LdSt/t6k/RwQCDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788793326; c=relaxed/simple; bh=lE4DoCX54IzHb9OGuqjtUGY0/Idn5+TuMdUQxkrjXI0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hSed0x9yYPaIeoQly2+P/o20MAEr/jB3JOA9rAIoxBxW7C7gH1JRnL2UgH86Dm/81QQUdaR6ZqPQysTyWQHHPtPd/MkrEd6IuL1AL7yvuUMl8s5wkPEF33+EfzTDizTO4nhkCrLjk2lSEDQ9qgfHbPyfRKY2UiP14zHK+ls61KU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net; spf=pass smtp.mailfrom=flipper.net; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b=u6C40K/A; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=flipper.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flipper.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=flipper.net header.i=@flipper.net header.b="u6C40K/A" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-495590dde14so52688975e9.0 for ; Mon, 07 Sep 2026 08:02:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flipper.net; s=google; t=1788793322; x=1789398122; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=9RcLvsK/2UZ/1TkMot9jvTvWpZC1OV1SBC2asu5tlgE=; b=u6C40K/AoJfOc0UJKHfKdH4eNeTn/xYZw7rKMR8ohuLczdIwf8/HWgY0tQ4OM0+nbt 6tgSns0EyX4evNav474AplIHNVMa12gNt8gUK7EXKHQ379kDbjqJ1RUO4dsDfDawWzFc MUitEE3l8nWzEMxA3wniYEFRIu62GR2L6XJhHFL68x2ves+2LA9Aid94ezf4zPsLYeYT /gnngSbNNurWHhq0uHMpE1afjMtuWcUVQMkcWqkgTt5sL5E8gkT5m0ZdQQf67fx6+WTP sESsA3ir//DP5P7uFDIF7DR4Y2PaqA8wk/wTxiaIkZR2jZTgYvG+5/S47G6B+O/tS2z5 okhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788793322; x=1789398122; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=9RcLvsK/2UZ/1TkMot9jvTvWpZC1OV1SBC2asu5tlgE=; b=CfNCQ1FttADqL3dVzxNlt0xEEMOGIk5Tki+HNP8yfVwSKtXgEmDoppmv34GiXfrGTm pdLF/njfFEXuOd+nfEc7TKH+nLvscHCoBlvmdpi+iPn0mHdc8DqNLxjaWfZZW/C3Gyys 7crUdYSf5fmlGE4eooD64ZWmX7odrYBAsnitfsEsJq2IKxJvYulMNvSI8KGxcaMX98dY a73J/OZ2aRbUGyQxWyp8rX0YtWOhuguJlpZ8DVudzHLOuhVQYmM13wLwp6y3QMUf/2N7 VyCdakWDM1E6nfb0Vl135/Pu22AWumG9hkqLRhyE/Xa8wicLB8p3/Pk4kXGYXZtP9F3e ibsQ== X-Forwarded-Encrypted: i=1; AKwUvBye8bWJKfkwnR0qVXoctqk69oTDncDLj8pv10Ha4cLVf1r3yo9yFUNnwilOevo4OIwUZYBsChxqpabEEBQ=@vger.kernel.org X-Gm-Message-State: AFuF++nmhyU0pzPDYdoejpGdSFUob3Int/B+ADicwXu56pqJNyuAMBFY qeWNGqrx7PzD0cgSDZ+9CTd/3twcl/aVR294AM6LXASKmfB02dciwL54KlgS8TtJLzs= X-Gm-Gg: AYBFou3OpT/mVE48IM+v8Aid5OI7b2GSb4tapZWDsQ/lXolT0TCSQJyB+l2vQgkjl9T panPCUWm7M7cAMXdN5TgMMDwx5OPRarLBghXKl4Hn0iL9bABVtkQ2wyV66X05ZbnlIICZmOuuzT xS5oOqGAEadhfhO38vGGG/pwS+KQ4PlVVKmh3P2JIGBffLX+U0/PCIM5tRR9tUw/lkGelhPzQAK bliXD2bajdKpfKjIqqIV+EsYdHxaSeJw8L9m04pKlDTG+eslpc3CZoduMYLl0nCxE0+TnaTHBAP Dr36yI9t92x5AFDmgoXtTIuppt7yCmm+hRMqU17xY03oWUD8L1aGmAs/O+ZgRMlyUJFq06gQCsy Y16glLysVrqOTvVF4yS54pjgE/zNxTTLwv5+3/DDHRxG3ZjKkM+Uf8nDmSpw8cJ8ACYiv/wRVW0 V6UurIkhu46+XHEkazcj85uPuQRQfAf3KigbpI8u2t3KioLW45NXn0CQD0UgpSrCw7kLoh+Sx91 w9OBOFgzjSQhhe9ZHCNN4x/PCvFf/KYD83X9Xum X-Received: by 2002:a05:600c:4e51:b0:49c:ff8d:b548 with SMTP id 5b1f17b1804b1-49cff8db5demr394817815e9.11.1788793322389; Mon, 07 Sep 2026 08:02:02 -0700 (PDT) Received: from alchark-surface.localdomain (bba-2-51-220-108.alshamil.net.ae. [2.51.220.108]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49cff8195ffsm262992705e9.14.2026.09.07.08.02.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 08:02:02 -0700 (PDT) From: Alexey Charkov Date: Mon, 07 Sep 2026 19:01:45 +0400 Subject: [PATCH 5/5] power: supply: bq257xx: Parse battery info before registering power supply 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 Message-Id: <20260907-bq257xx-init-v1-5-1a08b29e1a68@flipper.net> References: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> In-Reply-To: <20260907-bq257xx-init-v1-0-1a08b29e1a68@flipper.net> To: Sebastian Reichel , Lee Jones , Chris Morgan , Pavel Machek , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz Cc: Sebastian Reichel , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Alexey Charkov X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4653; i=alchark@flipper.net; h=from:subject:message-id; bh=lE4DoCX54IzHb9OGuqjtUGY0/Idn5+TuMdUQxkrjXI0=; b=owGbwMvMwCW2adGNfoHIK0sZT6slMWTNu3gn5r68dXzYz7dcrQITrplMiVg29dl/wfTKzSwtY a0yWSeOdExkYRDjYrAUU2SZ+22J7VQjvlm7PDy+wsxhZQIZIi3SwAAELAx8uYl5pUY6Rnqm2oZ6 hkY6xjpGDFycAjDV9yMYGa4m7EnwXfSQq3K6bMVdyU7XHeFN10wvfTmxsrNquZDC4fMMfwWvPb3 6wsfCrjO85+IUrm0fzvP9fMXtWOow9ZNlhIloMzsA X-Developer-Key: i=alchark@flipper.net; a=openpgp; fpr=9DF6A43D95320E9ABA4848F5B2A2D88F1059D4A5 Switch to a dev-based battery get/put interface to parse battery info before registering the power supply, so that nobody tries to access the power supply until we finish programming the device parameters. Signed-off-by: Alexey Charkov --- drivers/power/supply/bq257xx_charger.c | 50 ++++++++++++++++++++----------= ---- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/drivers/power/supply/bq257xx_charger.c b/drivers/power/supply/= bq257xx_charger.c index 8a645859460b..6faa1055b3ee 100644 --- a/drivers/power/supply/bq257xx_charger.c +++ b/drivers/power/supply/bq257xx_charger.c @@ -1165,38 +1165,38 @@ static const struct bq257xx_chip_info bq25792_chip_= info =3D { /** * bq257xx_parse_dt() - Parse the device tree for required properties * @pdata: driver platform data - * @psy_cfg: power supply config data * @dev: device struct * * Read the device tree to identify the minimum system voltage, the * maximum charge current, the maximum charge voltage, and the maximum - * input current. + * input current. Deliberately keyed off @dev rather than the charger power + * supply, so that it can run before the supply is registered. * * Return: Returns 0 on success or error code on error. */ -static int bq257xx_parse_dt(struct bq257xx_chg *pdata, - struct power_supply_config *psy_cfg, struct device *dev) +static int bq257xx_parse_dt(struct bq257xx_chg *pdata, struct device *dev) { struct power_supply_battery_info *bat_info; int ret; =20 - ret =3D power_supply_get_battery_info(pdata->charger, - &bat_info); + ret =3D power_supply_get_battery_info_from_dev(dev, &bat_info); if (ret) return dev_err_probe(dev, ret, "Unable to get battery info\n"); =20 if ((bat_info->voltage_min_design_uv <=3D 0) || (bat_info->constant_charge_voltage_max_uv <=3D 0) || - (bat_info->constant_charge_current_max_ua <=3D 0)) + (bat_info->constant_charge_current_max_ua <=3D 0)) { + power_supply_put_battery_info_from_dev(dev, bat_info); return dev_err_probe(dev, -EINVAL, "Required bat info missing or invalid\n"); + } =20 pdata->vsys_min =3D bat_info->voltage_min_design_uv; pdata->vbat_max =3D bat_info->constant_charge_voltage_max_uv; pdata->ichg_max =3D bat_info->constant_charge_current_max_ua; =20 - power_supply_put_battery_info(pdata->charger, bat_info); + power_supply_put_battery_info_from_dev(dev, bat_info); =20 ret =3D device_property_read_u32(dev, "input-current-limit-microamp", @@ -1212,9 +1212,14 @@ static int bq257xx_parse_dt(struct bq257xx_chg *pdat= a, * @pdev: platform device * * Probe the charger device, allocate driver data structure, select the - * appropriate chip-specific function pointers, register the power supply, - * parse device tree properties for battery limits, initialize hardware, - * and set up the interrupt handler if available. + * appropriate chip-specific function pointers, parse device tree properti= es + * for battery limits, initialize hardware, register the power supply, and= set + * up the interrupt handler if available. + * + * The power supply is registered only once the hardware is up, because + * registering it lets the core call ->external_power_changed() at any tim= e. A + * probe failure after that point would have devres free @pdata while such= a + * callback is still running on it. * * Return: Returns 0 on success or error code on failure. */ @@ -1247,6 +1252,14 @@ static int bq257xx_charger_probe(struct platform_dev= ice *pdev) =20 platform_set_drvdata(pdev, pdata); =20 + ret =3D bq257xx_parse_dt(pdata, dev); + if (ret) + return ret; + + ret =3D pdata->chip->bq257xx_hw_init(pdata); + if (ret) + return dev_err_probe(dev, ret, "Cannot initialize the charger\n"); + psy_cfg.drv_data =3D pdata; psy_cfg.fwnode =3D dev_fwnode(dev); =20 @@ -1257,16 +1270,11 @@ static int bq257xx_charger_probe(struct platform_de= vice *pdev) return dev_err_probe(dev, PTR_ERR(pdata->charger), "Power supply register charger failed\n"); =20 - ret =3D bq257xx_parse_dt(pdata, &psy_cfg, dev); - if (ret) - return ret; - - ret =3D pdata->chip->bq257xx_hw_init(pdata); - if (ret) - return dev_err_probe(dev, ret, "Cannot initialize the charger\n"); - - platform_set_drvdata(pdev, pdata); - + /* + * Requested after the supply is registered so that devres tears it down + * first, quiescing the interrupt before the supply it reports on goes + * away. + */ if (bq->client->irq) { ret =3D devm_request_threaded_irq(dev, bq->client->irq, NULL, bq257xx_irq_handler_thread, --=20 2.54.0