Commit db3c4e36 authored by Shenwei Wang's avatar Shenwei Wang Committed by Greg Kroah-Hartman
Browse files

usb: cdns3: imx: Rework system PM to avoid duplicated operations



The current implementation uses the same callbacks for system PM and
runtime PM suspend/resume without any state checking. This can cause the
clocks to be prepared/unprepared twice, leading to kernel warning issues.

This patch resolves the double prepare/unprepare issues by separating the
runtime PM and system PM handling.

Signed-off-by: default avatarShenwei Wang <shenwei.wang@nxp.com>
Reviewed-by: default avatarFrank Li <frank.li@nxp.com>
Link: https://lore.kernel.org/r/20230523184412.204582-1-shenwei.wang@nxp.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 622cc875
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -373,14 +373,22 @@ static inline bool cdns_imx_is_power_lost(struct cdns_imx *data)
		return false;
}

static int __maybe_unused cdns_imx_system_suspend(struct device *dev)
{
	pm_runtime_put_sync(dev);
	return 0;
}

static int __maybe_unused cdns_imx_system_resume(struct device *dev)
{
	struct cdns_imx *data = dev_get_drvdata(dev);
	int ret;

	ret = cdns_imx_resume(dev);
	if (ret)
	ret = pm_runtime_resume_and_get(dev);
	if (ret < 0) {
		dev_err(dev, "Could not get runtime PM.\n");
		return ret;
	}

	if (cdns_imx_is_power_lost(data)) {
		dev_dbg(dev, "resume from power lost\n");
@@ -403,7 +411,7 @@ static int cdns_imx_platform_suspend(struct device *dev,

static const struct dev_pm_ops cdns_imx_pm_ops = {
	SET_RUNTIME_PM_OPS(cdns_imx_suspend, cdns_imx_resume, NULL)
	SET_SYSTEM_SLEEP_PM_OPS(cdns_imx_suspend, cdns_imx_system_resume)
	SET_SYSTEM_SLEEP_PM_OPS(cdns_imx_system_suspend, cdns_imx_system_resume)
};

static const struct of_device_id cdns_imx_of_match[] = {