diff options
| author | Ziyi Guo <n7l8m4@u.northwestern.edu> | 2026-01-30 18:26:51 +0000 |
|---|---|---|
| committer | Sasha Levin <sashal@kernel.org> | 2026-03-04 07:20:07 -0500 |
| commit | 9da857e6b5fd87f79c0a4dac9e32d5a86616513e (patch) | |
| tree | b21f560a573a516b9dbc09a0e36b6589044f2712 /drivers/power/sequencing | |
| parent | aba5b98c4108812082f96a27a5181f1a146616af (diff) | |
power: sequencing: fix missing state_lock in pwrseq_power_on() error path
[ Upstream commit e1dccb485c2876ac1318f36ccc0155416c633a48 ]
pwrseq_power_on() calls pwrseq_unit_disable() when the
post_enable callback fails. However, this call is outside the
scoped_guard(mutex, &pwrseq->state_lock) block that ends.
pwrseq_unit_disable() has lockdep_assert_held(&pwrseq->state_lock),
which will fail when called from this error path.
Add the scoped_guard block to cover the post_enable callback and its
error handling to ensure the lock is held when pwrseq_unit_disable() is
called.
Signed-off-by: Ziyi Guo <n7l8m4@u.northwestern.edu>
Link: https://patch.msgid.link/20260130182651.1576579-1-n7l8m4@u.northwestern.edu
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'drivers/power/sequencing')
| -rw-r--r-- | drivers/power/sequencing/core.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/power/sequencing/core.c b/drivers/power/sequencing/core.c index 190564e55988..1fcf0af7cc0b 100644 --- a/drivers/power/sequencing/core.c +++ b/drivers/power/sequencing/core.c @@ -914,8 +914,10 @@ int pwrseq_power_on(struct pwrseq_desc *desc) if (target->post_enable) { ret = target->post_enable(pwrseq); if (ret) { - pwrseq_unit_disable(pwrseq, unit); - desc->powered_on = false; + scoped_guard(mutex, &pwrseq->state_lock) { + pwrseq_unit_disable(pwrseq, unit); + desc->powered_on = false; + } } } |
