[PATCH 08/11] ASoC: SOF: amd: add ACP7.B/7.F clock-stop detection in check_acp_sdw_enable_status
From: Vijendar Mukunda
Date: Thu Sep 10 2026 - 09:30:50 EST
Extend check_acp_sdw_enable_status() with a pci_rev switch so that
ACP7.B/7.F, which has 4 SoundWire manager instances, reads all four
SW_EN registers to determine whether any manager is in clock-stop mode.
The existing two-manager read (ACP_SW0_EN, ACP_SW1_EN) is preserved for
ACP63/ACP70/ACP71/ACP72 platforms.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@xxxxxxx>
---
sound/soc/sof/amd/acp-dsp-offset.h | 2 ++
sound/soc/sof/amd/acp.c | 23 +++++++++++++++++++----
2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/sound/soc/sof/amd/acp-dsp-offset.h b/sound/soc/sof/amd/acp-dsp-offset.h
index bea1bd3afa70..74abbc834d71 100644
--- a/sound/soc/sof/amd/acp-dsp-offset.h
+++ b/sound/soc/sof/amd/acp-dsp-offset.h
@@ -156,5 +156,7 @@
#define ACP7X_IDMA_ERROR_MASK 0x1FF9FF
#define ACP7X_ZSC_DSP_CTRL 0x001014
#define ACP7X_PME_EN ACP70_PME_EN
+/* SW enable base for SDW0; manager N uses ACP7X_SW_EN + (N * 0x2000) */
+#define ACP7X_SW_EN 0x5200
#endif
diff --git a/sound/soc/sof/amd/acp.c b/sound/soc/sof/amd/acp.c
index a900dbc1de20..a4ca4f78e106 100644
--- a/sound/soc/sof/amd/acp.c
+++ b/sound/soc/sof/amd/acp.c
@@ -779,15 +779,30 @@ static int acp_init(struct snd_sof_dev *sdev)
static bool check_acp_sdw_enable_status(struct snd_sof_dev *sdev)
{
struct acp_dev_data *acp_data;
- u32 sdw0_en, sdw1_en;
+ u32 sdw0_en, sdw1_en, sdw2_en, sdw3_en;
acp_data = sdev->pdata->hw_pdata;
if (!acp_data->sdw)
return false;
- sdw0_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SW0_EN);
- sdw1_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SW1_EN);
- acp_data->sdw_en_stat = sdw0_en || sdw1_en;
+ switch (acp_data->pci_rev) {
+ case ACP63_PCI_ID:
+ case ACP70_PCI_ID:
+ case ACP71_PCI_ID:
+ case ACP72_PCI_ID:
+ sdw0_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SW0_EN);
+ sdw1_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SW1_EN);
+ acp_data->sdw_en_stat = sdw0_en || sdw1_en;
+ break;
+ case ACP7B_PCI_ID:
+ case ACP7F_PCI_ID:
+ sdw0_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP7X_SW_EN + (0 * 0x2000));
+ sdw1_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP7X_SW_EN + (1 * 0x2000));
+ sdw2_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP7X_SW_EN + (2 * 0x2000));
+ sdw3_en = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP7X_SW_EN + (3 * 0x2000));
+ acp_data->sdw_en_stat = sdw0_en || sdw1_en || sdw2_en || sdw3_en;
+ break;
+ }
return acp_data->sdw_en_stat;
}
--
2.48.1