You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
ASoC: SOF: amd: Fix for acp init sequence
[ Upstream commit a42db293e5983aa1508d12644f23d73f0553b32c ]
When ACP is not powered on by default, acp power on sequence explicitly
invoked by programming pgfsm control mask. The existing implementation
checks the same PGFSM status mask and programs the same PGFSM control mask
in all ACP variants which breaks acp power on sequence for ACP6.0 and
ACP6.3 variants. So to fix this issue, update ACP pgfsm control mask and
status mask based on acp descriptor rev field, which will vary based on
acp variant.
Fixes: 846aef1d7c ("ASoC: SOF: amd: Add Renoir ACP HW support")
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Link: https://patch.msgid.link/20240816070328.610360-1-Vijendar.Mukunda@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a23387bc2d
commit
c4e86c157f
@@ -363,6 +363,7 @@ static int acp_power_on(struct snd_sof_dev *sdev)
|
||||
const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
|
||||
unsigned int base = desc->pgfsm_base;
|
||||
unsigned int val;
|
||||
unsigned int acp_pgfsm_status_mask, acp_pgfsm_cntl_mask;
|
||||
int ret;
|
||||
|
||||
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, base + PGFSM_STATUS_OFFSET);
|
||||
@@ -370,9 +371,23 @@ static int acp_power_on(struct snd_sof_dev *sdev)
|
||||
if (val == ACP_POWERED_ON)
|
||||
return 0;
|
||||
|
||||
if (val & ACP_PGFSM_STATUS_MASK)
|
||||
switch (desc->rev) {
|
||||
case 3:
|
||||
case 5:
|
||||
acp_pgfsm_status_mask = ACP3X_PGFSM_STATUS_MASK;
|
||||
acp_pgfsm_cntl_mask = ACP3X_PGFSM_CNTL_POWER_ON_MASK;
|
||||
break;
|
||||
case 6:
|
||||
acp_pgfsm_status_mask = ACP6X_PGFSM_STATUS_MASK;
|
||||
acp_pgfsm_cntl_mask = ACP6X_PGFSM_CNTL_POWER_ON_MASK;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (val & acp_pgfsm_status_mask)
|
||||
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + PGFSM_CONTROL_OFFSET,
|
||||
ACP_PGFSM_CNTL_POWER_ON_MASK);
|
||||
acp_pgfsm_cntl_mask);
|
||||
|
||||
ret = snd_sof_dsp_read_poll_timeout(sdev, ACP_DSP_BAR, base + PGFSM_STATUS_OFFSET, val,
|
||||
!val, ACP_REG_POLL_INTERVAL, ACP_REG_POLL_TIMEOUT_US);
|
||||
|
||||
@@ -22,8 +22,11 @@
|
||||
#define ACP_REG_POLL_TIMEOUT_US 2000
|
||||
#define ACP_DMA_COMPLETE_TIMEOUT_US 5000
|
||||
|
||||
#define ACP_PGFSM_CNTL_POWER_ON_MASK 0x01
|
||||
#define ACP_PGFSM_STATUS_MASK 0x03
|
||||
#define ACP3X_PGFSM_CNTL_POWER_ON_MASK 0x01
|
||||
#define ACP3X_PGFSM_STATUS_MASK 0x03
|
||||
#define ACP6X_PGFSM_CNTL_POWER_ON_MASK 0x07
|
||||
#define ACP6X_PGFSM_STATUS_MASK 0x0F
|
||||
|
||||
#define ACP_POWERED_ON 0x00
|
||||
#define ACP_ASSERT_RESET 0x01
|
||||
#define ACP_RELEASE_RESET 0x00
|
||||
|
||||
Reference in New Issue
Block a user