intel_adsp: ace20_lnl: Fix hang issue on SSP power off
Clearing SPA bit together with OFFLEN bit causes FW hang. This patch changes sequence to avoid that situation. Signed-off-by: Jaroslaw Stelter <Jaroslaw.Stelter@intel.com> Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
parent
3b518743d2
commit
b252673f13
1 changed files with 10 additions and 3 deletions
|
@ -726,12 +726,15 @@ static void dai_ssp_pm_runtime_en_ssp_power(struct dai_intel_ssp *dp, uint32_t i
|
||||||
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
||||||
#elif CONFIG_SOC_INTEL_ACE20_LNL
|
#elif CONFIG_SOC_INTEL_ACE20_LNL
|
||||||
sys_write32(sys_read32(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET) |
|
sys_write32(sys_read32(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET) |
|
||||||
I2SLCTL_SPA(index) | I2SLCTL_OFLEN,
|
I2SLCTL_SPA(index),
|
||||||
dai_hdamlssp_base(dp) + I2SLCTL_OFFSET);
|
dai_hdamlssp_base(dp) + I2SLCTL_OFFSET);
|
||||||
/* Check if powered on. */
|
/* Check if powered on. */
|
||||||
ret = dai_ssp_poll_for_register_delay(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET,
|
ret = dai_ssp_poll_for_register_delay(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET,
|
||||||
I2SLCTL_CPA(index), 0,
|
I2SLCTL_CPA(index), 0,
|
||||||
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
||||||
|
sys_write32(sys_read32(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET) | I2SLCTL_OFLEN,
|
||||||
|
dai_hdamlssp_base(dp) + I2SLCTL_OFFSET);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error need to define SOC
|
#error need to define SOC
|
||||||
#endif
|
#endif
|
||||||
|
@ -761,13 +764,17 @@ static void dai_ssp_pm_runtime_dis_ssp_power(struct dai_intel_ssp *dp, uint32_t
|
||||||
I2SLCTL_CPA(index), I2SLCTL_CPA(index),
|
I2SLCTL_CPA(index), I2SLCTL_CPA(index),
|
||||||
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
||||||
#elif CONFIG_SOC_INTEL_ACE20_LNL
|
#elif CONFIG_SOC_INTEL_ACE20_LNL
|
||||||
sys_write32(sys_read32(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET) & (~I2SLCTL_SPA(index)) &
|
sys_write32(sys_read32(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET) & (~I2SLCTL_SPA(index)),
|
||||||
(~I2SLCTL_OFLEN), dai_hdamlssp_base(dp) + I2SLCTL_OFFSET);
|
dai_hdamlssp_base(dp) + I2SLCTL_OFFSET);
|
||||||
|
|
||||||
/* Check if powered off. */
|
/* Check if powered off. */
|
||||||
ret = dai_ssp_poll_for_register_delay(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET,
|
ret = dai_ssp_poll_for_register_delay(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET,
|
||||||
I2SLCTL_CPA(index), I2SLCTL_CPA(index),
|
I2SLCTL_CPA(index), I2SLCTL_CPA(index),
|
||||||
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
DAI_INTEL_SSP_MAX_SEND_TIME_PER_SAMPLE);
|
||||||
|
|
||||||
|
sys_write32(sys_read32(dai_hdamlssp_base(dp) + I2SLCTL_OFFSET) & (~I2SLCTL_OFLEN),
|
||||||
|
dai_hdamlssp_base(dp) + I2SLCTL_OFFSET);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error need to define SOC
|
#error need to define SOC
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue