[PATCH v1] ASoC: Intel: sof_sdw: Add ASUS UX5406AA SoundWire configuration
From: Denys Papushaiev
Date: Tue Aug 11 2026 - 16:58:45 EST
The ASUS ZenBook S14 UX5406AA has a CS42L43 codec on SoundWire link 3 and four CS35L56 speaker amplifiers on links 1 and 2.
The existing machine table only describes the CS35L56 amplifiers on link 2. As a result, the machine configuration is not matched and SOF falls back to function topology enumeration. That fallback creates duplicate DAI link names and prevents the audio card from being initialized.
Add the missing SoundWire ADR entries and aggregated speaker endpoints for the two CS35L56 amplifiers on link 1. Add a machine-table entry matching links 1, 2 and 3 and reuse the existing CS42L43/CS35L56 topology.
Tested on an ASUS ZenBook S14 UX5406AA with kernel 7.1.8-arch1-3. The SOF card initializes successfully and all four CS35L56 amplifiers are detected and calibrated.
Signed-off-by: Denys Papushaiev <denqxotl@xxxxxxxxx>
---
.../intel/common/soc-acpi-intel-ptl-match.c | 67 +++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
index f7694b2a2b02..b62a946062e4 100644
--- a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
@@ -92,6 +92,21 @@ static const struct snd_soc_acpi_endpoint spk_r_endpoint = {
.group_id = 1,
};
+/* Endpoints for 4-channel CS35L56 configurations (e.g. ASUS ZenBook UX5406AA) */
+static const struct snd_soc_acpi_endpoint spk_3_endpoint = {
+ .num = 0,
+ .aggregated = 1,
+ .group_position = 2,
+ .group_id = 1,
+};
+
+static const struct snd_soc_acpi_endpoint spk_4_endpoint = {
+ .num = 0,
+ .aggregated = 1,
+ .group_position = 3,
+ .group_id = 1,
+};
+
static const struct snd_soc_acpi_endpoint jack_dmic_endpoints[] = {
/* Jack Endpoint */
{
@@ -184,6 +199,26 @@ static const struct snd_soc_acpi_adr_device cs35l56_2_lr_adr[] = {
}
};
+/*
+ * ASUS ZenBook S14 UX5406AA (Panther Lake) has 4x CS35L56 amps:
+ * 2 amps on SoundWire link 1 (unique_id 2 and 3)
+ * 2 amps on SoundWire link 2 (unique_id 0 and 1)
+ */
+static const struct snd_soc_acpi_adr_device cs35l56_1_lr_adr[] = {
+ {
+ .adr = 0x00013201fa355601ull,
+ .num_endpoints = 1,
+ .endpoints = &spk_3_endpoint,
+ .name_prefix = "AMP3"
+ },
+ {
+ .adr = 0x00013301fa355601ull,
+ .num_endpoints = 1,
+ .endpoints = &spk_4_endpoint,
+ .name_prefix = "AMP4"
+ }
+};
+
static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
{
.adr = 0x000030025D071101ull,
@@ -315,6 +350,30 @@ static const struct snd_soc_acpi_link_adr ptl_cs42l43_agg_l3_cs35l56_l2[] = {
{}
};
+/*
+ * ASUS ZenBook S14 UX5406AA: CS42L43 on link 3, CS35L56 x4 on links 1 and 2.
+ * Link 1 carries AMP3 (uid=2) and AMP4 (uid=3).
+ * Link 2 carries AMP1 (uid=0) and AMP2 (uid=1).
+ */
+static const struct snd_soc_acpi_link_adr ptl_cs42l43_agg_l3_cs35l56_l12[] = {
+ {
+ .mask = BIT(3),
+ .num_adr = ARRAY_SIZE(cs42l43_3_agg_adr),
+ .adr_d = cs42l43_3_agg_adr,
+ },
+ {
+ .mask = BIT(2),
+ .num_adr = ARRAY_SIZE(cs35l56_2_lr_adr),
+ .adr_d = cs35l56_2_lr_adr,
+ },
+ {
+ .mask = BIT(1),
+ .num_adr = ARRAY_SIZE(cs35l56_1_lr_adr),
+ .adr_d = cs35l56_1_lr_adr,
+ },
+ {}
+};
+
static const struct snd_soc_acpi_link_adr ptl_rt722_l0_rt1320_l23[] = {
{
.mask = BIT(0),
@@ -510,6 +569,14 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_sdw_machines[] = {
.sof_tplg_filename = "sof-ptl-rt712-l3-rt1320-l2.tplg",
.get_function_tplg_files = sof_sdw_get_tplg_files,
},
+ {
+ /* ASUS ZenBook S14 UX5406AA (Panther Lake): 4x CS35L56 */
+ /* on links 1+2, CS42L43 on link 3 */
+ .link_mask = BIT(1) | BIT(2) | BIT(3),
+ .links = ptl_cs42l43_agg_l3_cs35l56_l12,
+ .drv_name = "sof_sdw",
+ .sof_tplg_filename = "sof-ptl-cs42l43-agg-l3-cs35l56-l2.tplg",
+ },
{
.link_mask = BIT(2) | BIT(3),
.links = ptl_cs42l43_agg_l3_cs35l56_l2,
--
2.55.0