[PATCH 2/2] media: sti: hva: Release the runtime clock on teardown

From: Myeonghun Pak

Date: Mon Sep 14 2026 - 21:14:06 EST


hva_hw_remove() drops the probe's runtime PM reference asynchronously
before disabling runtime PM. Disabling PM can cancel the queued suspend
and leave its clock prepared and enabled. The IP-version error path has
the same problem.

Disable runtime PM before checking its final status, then suspend the
hardware directly if still active and record the suspended state. Drop
the probe reference without queuing more PM work. Skip direct clock
cleanup when CONFIG_PM is disabled, since no runtime callback acquired it.

This issue was identified during our ongoing static-analysis research
while reviewing kernel code.

Fixes: 57b2c0628b60 ("[media] st-hva: multi-format video encoder V4L2 driver")
Cc: stable@xxxxxxxxxxxxxxx
Assisted-by: LLM
Co-developed-by: Ijae Kim <ae878000@xxxxxxxxx>
Signed-off-by: Ijae Kim <ae878000@xxxxxxxxx>
Signed-off-by: Myeonghun Pak <mhun512@xxxxxxxxx>
---
drivers/media/platform/st/sti/hva/hva-hw.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/st/sti/hva/hva-hw.c b/drivers/media/platform/st/sti/hva/hva-hw.c
index a608e35..cb55dde 100644
--- a/drivers/media/platform/st/sti/hva/hva-hw.c
+++ b/drivers/media/platform/st/sti/hva/hva-hw.c
@@ -395,9 +395,12 @@ int hva_hw_probe(struct platform_device *pdev, struct hva_dev *hva)
return 0;

err_pm:
- pm_runtime_put(dev);
+ pm_runtime_put_noidle(dev);
err_disable:
pm_runtime_disable(dev);
+ if (IS_ENABLED(CONFIG_PM) && !pm_runtime_status_suspended(dev))
+ hva_hw_runtime_suspend(dev);
+ pm_runtime_set_suspended(dev);

return ret;
}
@@ -409,8 +412,11 @@ void hva_hw_remove(struct hva_dev *hva)
disable_irq(hva->irq_its);
disable_irq(hva->irq_err);

- pm_runtime_put_autosuspend(dev);
pm_runtime_disable(dev);
+ if (IS_ENABLED(CONFIG_PM) && !pm_runtime_status_suspended(dev))
+ hva_hw_runtime_suspend(dev);
+ pm_runtime_set_suspended(dev);
+ pm_runtime_put_noidle(dev);
}

int hva_hw_runtime_suspend(struct device *dev)