[PATCH v4 05/16] ASoC: amd: acp: add ACP7.B/7.F SoundWire DAI link support

From: Vijendar Mukunda

Date: Fri Oct 30 2026 - 05:49:19 EST


Add CPU pin ID lookup and SoundWire DAI link support for ACP7.B/7.F
platforms with up to 4 SoundWire managers.

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@xxxxxxx>
---
sound/soc/amd/acp/acp-sdw-mach-common.c | 48 +++++++++++++++++++++++++
sound/soc/amd/acp/acp-sdw-sof-mach.c | 7 ++++
sound/soc/amd/acp/soc_amd_sdw_common.h | 38 ++++++++++++++++++++
3 files changed, 93 insertions(+)

diff --git a/sound/soc/amd/acp/acp-sdw-mach-common.c b/sound/soc/amd/acp/acp-sdw-mach-common.c
index e5f394dc2f4c..40184674dc80 100644
--- a/sound/soc/amd/acp/acp-sdw-mach-common.c
+++ b/sound/soc/amd/acp/acp-sdw-mach-common.c
@@ -93,6 +93,54 @@ int get_acp70_cpu_pin_id(u32 sdw_link_id, int be_id, int *cpu_pin_id, struct dev
}
EXPORT_SYMBOL_NS_GPL(get_acp70_cpu_pin_id, "SND_SOC_AMD_SDW_MACH");

+/*
+ * On ACP7x, each SoundWire data port has a dedicated DMA channel
+ * hardwired in hardware. This function selects only the ports required
+ * by the currently supported ACP7x machine topologies:
+ * AUDIO0_TX (0) - headset/jack playback
+ * AUDIO4_TX (4) - amplifier/speaker playback
+ * AUDIO0_RX (11) - headset/jack capture
+ * AUDIO4_RX (15) - amplifier/speaker capture (feedback)
+ * AUDIO5_RX (16) - DMIC capture
+ * The remaining port IDs are defined to reflect the full hardware
+ * data port layout.
+ */
+int get_acp7x_cpu_pin_id(u32 sdw_link_id, int be_id, int *cpu_pin_id, struct device *dev)
+{
+ switch (sdw_link_id) {
+ case AMD_SDW0:
+ case AMD_SDW1:
+ case AMD_SDW2:
+ case AMD_SDW3:
+ switch (be_id) {
+ case SOC_SDW_JACK_OUT_DAI_ID:
+ *cpu_pin_id = ACP7X_SW_AUDIO0_TX;
+ break;
+ case SOC_SDW_JACK_IN_DAI_ID:
+ *cpu_pin_id = ACP7X_SW_AUDIO0_RX;
+ break;
+ case SOC_SDW_AMP_OUT_DAI_ID:
+ *cpu_pin_id = ACP7X_SW_AUDIO4_TX;
+ break;
+ case SOC_SDW_AMP_IN_DAI_ID:
+ *cpu_pin_id = ACP7X_SW_AUDIO4_RX;
+ break;
+ case SOC_SDW_DMIC_DAI_ID:
+ *cpu_pin_id = ACP7X_SW_AUDIO5_RX;
+ break;
+ default:
+ dev_err(dev, "Invalid be id:%d\n", be_id);
+ return -EINVAL;
+ }
+ break;
+ default:
+ return -EINVAL;
+ }
+ dev_dbg(dev, "sdw_link_id:%d, be_id:%d, cpu_pin_id:%d\n", sdw_link_id, be_id, *cpu_pin_id);
+ return 0;
+}
+EXPORT_SYMBOL_NS_GPL(get_acp7x_cpu_pin_id, "SND_SOC_AMD_SDW_MACH");
+
MODULE_DESCRIPTION("AMD SoundWire Common Machine driver");
MODULE_AUTHOR("Vijendar Mukunda <Vijendar.Mukunda@xxxxxxx>");
MODULE_LICENSE("GPL");
diff --git a/sound/soc/amd/acp/acp-sdw-sof-mach.c b/sound/soc/amd/acp/acp-sdw-sof-mach.c
index 46c3815a777f..97b2e224492f 100644
--- a/sound/soc/amd/acp/acp-sdw-sof-mach.c
+++ b/sound/soc/amd/acp/acp-sdw-sof-mach.c
@@ -145,6 +145,13 @@ static int create_sdw_dailink(struct snd_soc_card *card,
if (ret)
return ret;
break;
+ case ACP7B_PCI_REV:
+ case ACP7F_PCI_REV:
+ ret = get_acp7x_cpu_pin_id(ffs(sof_end->link_mask) - 1,
+ *be_id, &cpu_pin_id, dev);
+ if (ret)
+ return ret;
+ break;
default:
return -EINVAL;
}
diff --git a/sound/soc/amd/acp/soc_amd_sdw_common.h b/sound/soc/amd/acp/soc_amd_sdw_common.h
index c98d70a0d6ce..c979adf4e978 100644
--- a/sound/soc/amd/acp/soc_amd_sdw_common.h
+++ b/sound/soc/amd/acp/soc_amd_sdw_common.h
@@ -33,6 +33,8 @@

#define AMD_SDW0 0
#define AMD_SDW1 1
+#define AMD_SDW2 2
+#define AMD_SDW3 3
#define ACP63_SW0_AUDIO0_TX 0
#define ACP63_SW0_AUDIO1_TX 1
#define ACP63_SW0_AUDIO2_TX 2
@@ -54,6 +56,41 @@
#define ACP70_SW_AUDIO1_RX 4
#define ACP70_SW_AUDIO2_RX 5

+/*
+ * ACP7.B/7.F SoundWire CPU pin IDs.
+ *
+ * ACP7x hardware exposes 11 TX and 11 RX data ports per SoundWire
+ * instance, each with a dedicated DMA channel hardwired in hardware.
+ * The CPU pin IDs use a flat linear numbering shared across all four
+ * SoundWire links (SW0-SW3): TX ports are numbered 0-10 and RX ports
+ * are numbered 11-21. All port IDs are defined here to represent the
+ * ACP7x hardware data port layout. The ID numbering differs from
+ * ACP70 due to hardware differences between ACP70 and ACP7x.
+ */
+#define ACP7X_SW_AUDIO0_TX 0
+#define ACP7X_SW_AUDIO1_TX 1
+#define ACP7X_SW_AUDIO2_TX 2
+#define ACP7X_SW_AUDIO3_TX 3
+#define ACP7X_SW_AUDIO4_TX 4
+#define ACP7X_SW_AUDIO5_TX 5
+#define ACP7X_SW_AUDIO6_TX 6
+#define ACP7X_SW_AUDIO7_TX 7
+#define ACP7X_SW_AUDIO8_TX 8
+#define ACP7X_SW_AUDIO9_TX 9
+#define ACP7X_SW_AUDIO10_TX 10
+
+#define ACP7X_SW_AUDIO0_RX 11
+#define ACP7X_SW_AUDIO1_RX 12
+#define ACP7X_SW_AUDIO2_RX 13
+#define ACP7X_SW_AUDIO3_RX 14
+#define ACP7X_SW_AUDIO4_RX 15
+#define ACP7X_SW_AUDIO5_RX 16
+#define ACP7X_SW_AUDIO6_RX 17
+#define ACP7X_SW_AUDIO7_RX 18
+#define ACP7X_SW_AUDIO8_RX 19
+#define ACP7X_SW_AUDIO9_RX 20
+#define ACP7X_SW_AUDIO10_RX 21
+
struct amd_mc_ctx {
unsigned int acp_rev;
unsigned int max_sdw_links;
@@ -61,5 +98,6 @@ struct amd_mc_ctx {

int get_acp63_cpu_pin_id(u32 sdw_link_id, int be_id, int *cpu_pin_id, struct device *dev);
int get_acp70_cpu_pin_id(u32 sdw_link_id, int be_id, int *cpu_pin_id, struct device *dev);
+int get_acp7x_cpu_pin_id(u32 sdw_link_id, int be_id, int *cpu_pin_id, struct device *dev);

#endif
--
2.53.0