diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index f79966eab53e..194e976689fd 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -2302,6 +2302,7 @@ static int swrm_runtime_resume(struct device *dev) struct platform_device *pdev = to_platform_device(dev); struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); int ret = 0; + bool clk_err = false; struct swr_master *mstr = &swrm->master; struct swr_device *swr_dev; @@ -2315,6 +2316,7 @@ static int swrm_runtime_resume(struct device *dev) dev_err(dev, "%s:lpass core hw enable failed\n", __func__); ret = 0; + clk_err = true; } } @@ -2362,7 +2364,7 @@ static int swrm_runtime_resume(struct device *dev) swrm->state = SWR_MSTR_UP; } exit: - if (swrm->lpass_core_hw_vote) + if (swrm->lpass_core_hw_vote && !clk_err) clk_disable_unprepare(swrm->lpass_core_hw_vote); pm_runtime_set_autosuspend_delay(&pdev->dev, auto_suspend_timer); mutex_unlock(&swrm->reslock); @@ -2374,6 +2376,7 @@ static int swrm_runtime_suspend(struct device *dev) struct platform_device *pdev = to_platform_device(dev); struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev); int ret = 0; + bool clk_err = false; struct swr_master *mstr = &swrm->master; struct swr_device *swr_dev; int current_state = 0; @@ -2390,6 +2393,7 @@ static int swrm_runtime_suspend(struct device *dev) dev_err(dev, "%s:lpass core hw enable failed\n", __func__); ret = 0; + clk_err = true; } } @@ -2443,7 +2447,7 @@ static int swrm_runtime_suspend(struct device *dev) if (current_state != SWR_MSTR_SSR) swrm->state = SWR_MSTR_DOWN; exit: - if (swrm->lpass_core_hw_vote) + if (swrm->lpass_core_hw_vote && !clk_err) clk_disable_unprepare(swrm->lpass_core_hw_vote); mutex_unlock(&swrm->reslock); return ret;