asoc: update digital_cdc_rsc_mgr_hw_vote API

Update digital_cdc_rsc_mgr_hw_vote_enable/disable API with device
info for easy debug. Also, add swrm clock enable checks during SSR.
When SSR happens, swrm->hw_core_clk_en and swrm->aud_core_clk_en will
be reset without resetting audio_vote and core_vote clk. This would
cause clk mismatch in audio driver and adsp and device fails suspending
when there's no audio usecase. Make this change to reset audio_vote
and core_vote clk when receiving SWR_DEVICE_SSR_DOWN.

Change-Id: I9875aac9f6faf8b6481457a70f31b005073369e0
Signed-off-by: Meng Wang <quic_mengw@quicinc.com>
This commit is contained in:
Meng Wang
2021-12-21 09:12:31 +08:00
committed by Gerrit - the friendly Code Review server
parent 42e49611b0
commit 95c95b2d67
6 changed files with 34 additions and 22 deletions

View File

@@ -425,7 +425,7 @@ static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm,
if (++swrm->hw_core_clk_en == 1) {
ret =
digital_cdc_rsc_mgr_hw_vote_enable(
swrm->lpass_core_hw_vote);
swrm->lpass_core_hw_vote, swrm->dev);
if (ret < 0) {
dev_err_ratelimited(swrm->dev,
"%s:lpass core hw enable failed\n",
@@ -439,7 +439,7 @@ static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm,
swrm->hw_core_clk_en = 0;
else if (swrm->hw_core_clk_en == 0)
digital_cdc_rsc_mgr_hw_vote_disable(
swrm->lpass_core_hw_vote);
swrm->lpass_core_hw_vote, swrm->dev);
}
}
}
@@ -457,7 +457,7 @@ static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm,
if (++swrm->aud_core_clk_en == 1) {
ret =
digital_cdc_rsc_mgr_hw_vote_enable(
swrm->lpass_core_audio);
swrm->lpass_core_audio, swrm->dev);
if (ret < 0) {
dev_err_ratelimited(swrm->dev,
"%s:lpass audio hw enable failed\n",
@@ -471,7 +471,7 @@ static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm,
swrm->aud_core_clk_en = 0;
else if (swrm->aud_core_clk_en == 0)
digital_cdc_rsc_mgr_hw_vote_disable(
swrm->lpass_core_audio);
swrm->lpass_core_audio, swrm->dev);
}
}
}
@@ -3681,7 +3681,13 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
swrm_device_down(&pdev->dev);
mutex_lock(&swrm->devlock);
swrm->dev_up = false;
if (swrm->hw_core_clk_en)
digital_cdc_rsc_mgr_hw_vote_disable(
swrm->lpass_core_hw_vote, swrm->dev);
swrm->hw_core_clk_en = 0;
if (swrm->aud_core_clk_en)
digital_cdc_rsc_mgr_hw_vote_disable(
swrm->lpass_core_audio, swrm->dev);
swrm->aud_core_clk_en = 0;
mutex_unlock(&swrm->devlock);
mutex_lock(&swrm->reslock);