summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorWentao Liang <vulab@iscas.ac.cn>2026-06-08 07:11:23 +0000
committerAndi Shyti <andi.shyti@kernel.org>2026-06-08 17:35:03 +0200
commit9c37eac31c559b079d55890d1dbe70072fec0435 (patch)
treee9134e8aa3de464e19ffe3105f62b5fd190e78f9 /drivers/i2c
parent4549871118cf616eecdd2d939f78e3b9e1dddc48 (diff)
i2c: riic: fix refcount leak in riic_i2c_resume_noirq()
When riic_i2c_resume_noirq() is called, it deasserts the reset using reset_control_deassert(), which for shared resets increments a reference count. If pm_runtime_force_resume() then fails, the function returns without calling reset_control_assert() to decrement the count. This leaves the reset deasserted and the reference count unbalanced, which can prevent other users of the shared reset from properly asserting it later. Fix the leak by calling reset_control_assert() on the error handling path for a failed pm_runtime_force_resume(). Fixes: e383f0961422 ("i2c: riic: Move suspend handling to NOIRQ phase") Signed-off-by: Wentao Liang <vulab@iscas.ac.cn> Cc: <stable@vger.kernel.org> # v6.19+ Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Andi Shyti <andi.shyti@kernel.org> Link: https://lore.kernel.org/r/20260608071123.128964-1-vulab@iscas.ac.cn
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-riic.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 9e3595b3623e..6d2ebf67dd62 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -725,8 +725,10 @@ static int riic_i2c_resume_noirq(struct device *dev)
return ret;
ret = pm_runtime_force_resume(dev);
- if (ret)
+ if (ret) {
+ reset_control_assert(riic->rstc);
return ret;
+ }
ret = riic_init_hw(riic);
if (ret) {