Commit c1a6edf3 authored by Vignesh Raghavendra's avatar Vignesh Raghavendra Committed by Wim Van Sebroeck

watchdog: rti_wdt: Drop runtime pm reference count when watchdog is unused

Call runtime_pm_put*() if watchdog is not already started during probe and re
enable it in watchdog start as required.

On K3 SoCs, watchdogs and their corresponding CPUs are under same
power-domain, so if the reference count of unused watchdogs aren't
dropped, it will lead to CPU hotplug failures as Device Management
firmware won't allow to turn off the power-domain due to dangling
reference count.

Fixes: 2d63908b ("watchdog: Add K3 RTI watchdog support")
Signed-off-by: default avatarVignesh Raghavendra <vigneshr@ti.com>
Tested-by: default avatarManorit Chawdhry <m-chawdhry@ti.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20231213140110.938129-1-vigneshr@ti.comSigned-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
parent f7799988
......@@ -77,6 +77,11 @@ static int rti_wdt_start(struct watchdog_device *wdd)
{
u32 timer_margin;
struct rti_wdt_device *wdt = watchdog_get_drvdata(wdd);
int ret;
ret = pm_runtime_resume_and_get(wdd->parent);
if (ret)
return ret;
/* set timeout period */
timer_margin = (u64)wdd->timeout * wdt->freq;
......@@ -343,6 +348,9 @@ static int rti_wdt_probe(struct platform_device *pdev)
if (last_ping)
watchdog_set_last_hw_keepalive(wdd, last_ping);
if (!watchdog_hw_running(wdd))
pm_runtime_put_sync(&pdev->dev);
return 0;
err_iomap:
......@@ -357,7 +365,10 @@ static void rti_wdt_remove(struct platform_device *pdev)
struct rti_wdt_device *wdt = platform_get_drvdata(pdev);
watchdog_unregister_device(&wdt->wdd);
pm_runtime_put(&pdev->dev);
if (!pm_runtime_suspended(&pdev->dev))
pm_runtime_put(&pdev->dev);
pm_runtime_disable(&pdev->dev);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment