* [PATCH] hwmon: (pmbus) Fix passing events to regulator core
@ 2026-06-29 23:14 Guenter Roeck
2026-06-29 23:19 ` sashiko-bot
0 siblings, 1 reply; 2+ messages in thread
From: Guenter Roeck @ 2026-06-29 23:14 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck, Sashiko
Sashiko reports:
Commit 754bd2b4a084 ("hwmon: (pmbus/core) Protect regulator operations with
mutex") introduced a worker to batch regulator events over time using
atomic_or(). The delayed worker then passes the combined bitmask unmodified
to regulator_notifier_call_chain().
The core regulator subsystem's regulator_handle_critical() function
evaluates the event parameter using a strict switch statement. If
multiple distinct faults occur before the worker runs (e.g.,
REGULATOR_EVENT_UNDER_VOLTAGE | REGULATOR_EVENT_OVER_CURRENT), the combined
bitmask fails to match any case. This leaves the reason as NULL and
completely bypasses the critical hw_protection_trigger().
Fix the problem by passing events bit by bit to the regulator event
handler.
Reported-by: Sashiko <sashiko-bot@kernel.org>
Fixes: 754bd2b4a084 ("hwmon: (pmbus/core) Protect regulator operations with mutex")
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/pmbus/pmbus_core.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c
index e8fdd799c71c..997b328964bc 100644
--- a/drivers/hwmon/pmbus/pmbus_core.c
+++ b/drivers/hwmon/pmbus/pmbus_core.c
@@ -3329,18 +3329,23 @@ static void pmbus_regulator_notify_worker(struct work_struct *work)
int i, j;
for (i = 0; i < data->info->pages; i++) {
- int event;
+ unsigned int event;
event = atomic_xchg(&data->regulator_events[i], 0);
if (!event)
continue;
for (j = 0; j < data->info->num_regulators; j++) {
- if (i == rdev_get_id(data->rdevs[j])) {
+ if (i != rdev_get_id(data->rdevs[j]))
+ continue;
+ while (event) {
+ unsigned int _event = BIT(__ffs(event));
+
regulator_notifier_call_chain(data->rdevs[j],
- event, NULL);
- break;
+ _event, NULL);
+ event &= ~_event;
}
+ break;
}
}
}
--
2.45.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] hwmon: (pmbus) Fix passing events to regulator core
2026-06-29 23:14 [PATCH] hwmon: (pmbus) Fix passing events to regulator core Guenter Roeck
@ 2026-06-29 23:19 ` sashiko-bot
0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-06-29 23:19 UTC (permalink / raw)
To: Guenter Roeck; +Cc: linux-hwmon
> Sashiko reports:
>
> Commit 754bd2b4a084 ("hwmon: (pmbus/core) Protect regulator operations with
> mutex") introduced a worker to batch regulator events over time using
> atomic_or(). The delayed worker then passes the combined bitmask unmodified
> to regulator_notifier_call_chain().
>
> The core regulator subsystem's regulator_handle_critical() function
> evaluates the event parameter using a strict switch statement. If
> multiple distinct faults occur before the worker runs (e.g.,
> REGULATOR_EVENT_UNDER_VOLTAGE | REGULATOR_EVENT_OVER_CURRENT), the combined
> bitmask fails to match any case. This leaves the reason as NULL and
> completely bypasses the critical hw_protection_trigger().
>
> Fix the problem by passing events bit by bit to the regulator event
> handler.
>
> Reported-by: Sashiko <sashiko-bot@kernel.org>
> Fixes: 754bd2b4a084 ("hwmon: (pmbus/core) Protect regulator operations with mutex")
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260629231434.2011247-1-linux@roeck-us.net?part=1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-06-29 23:19 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-29 23:14 [PATCH] hwmon: (pmbus) Fix passing events to regulator core Guenter Roeck
2026-06-29 23:19 ` sashiko-bot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.