Răsfoiți Sursa

Merge "soundwire: exit from pm function for LPASS HW Core fails"

qctecmdr 5 ani în urmă
părinte
comite
e7afbdeeb6
1 a modificat fișierele cu 6 adăugiri și 2 ștergeri
  1. 6 2
      soc/swr-mstr-ctrl.c

+ 6 - 2
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;