Skip to content

Commit 7a699f4

Browse files
DAI: Add SoundWire DAI support for native zephyr
This adds SoundWire DAI support for ACP 7.0 native zephyr. Signed-off-by: Sivasubramanian <sravisar@amd.com>
1 parent 144bc92 commit 7a699f4

7 files changed

Lines changed: 76 additions & 10 deletions

File tree

src/audio/dai-zephyr.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ __cold int dai_set_config(struct dai *dai, struct ipc_config_dai *common_config,
192192
cfg.type = DAI_IMX_MICFIL;
193193
cfg_params = &sof_cfg->micfil;
194194
break;
195+
case SOF_DAI_AMD_SDW:
196+
cfg.type = DAI_AMD_SDW;
197+
cfg_params = &sof_cfg->acpsdw;
198+
break;
195199
default:
196200
return -EINVAL;
197201
}

src/drivers/amd/rembrandt/acp_sw_audio_dai.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// SPDX-License-Identifier: BSD-3-Clause
22
//
3-
//Copyright(c) 2023 AMD. All rights reserved.
3+
//Copyright(c) 2023, 2026 AMD. All rights reserved.
44
//
55
//Author: Basavaraj Hiregoudar <basavaraj.hiregoudar@amd.com>
66
// Maruthi Machani <maruthi.machani@amd.com>
7+
// Sivasubramanian <sravisar@amd.com>
78

89
#include <sof/drivers/acp_dai_dma.h>
910
#include <sof/lib/uuid.h>
@@ -95,7 +96,7 @@ static int swaudiodai_get_hw_params(struct dai *dai,
9596
}
9697

9798
const struct dai_driver acp_swaudiodai_driver = {
98-
.type = SOF_DAI_AMD_SW_AUDIO,
99+
.type = SOF_DAI_AMD_SDW,
99100
.uid = SOF_UUID(swaudiodai_uuid),
100101
.tctx = &swaudiodai_tr,
101102
.dma_dev = DMA_DEV_SW,

src/include/ipc/dai.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ enum sof_ipc_dai_type {
9494
SOF_DAI_AMD_SP_VIRTUAL, /**<Amd SP VIRTUAL */
9595
SOF_DAI_AMD_HS_VIRTUAL, /**<Amd HS VIRTUAL */
9696
SOF_DAI_IMX_MICFIL, /**< i.MX MICFIL */
97-
SOF_DAI_AMD_SW_AUDIO /**<Amd SW AUDIO */
97+
SOF_DAI_AMD_SDW /**< Amd SDW */
9898
};
9999

100100
/* general purpose DAI configuration */

src/ipc/ipc3/dai.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,14 @@ int dai_config_dma_channel(struct dai_data *dd, struct comp_dev *dev, const void
9393
break;
9494
case SOF_DAI_AMD_HS:
9595
case SOF_DAI_AMD_HS_VIRTUAL:
96-
case SOF_DAI_AMD_SW_AUDIO:
96+
case SOF_DAI_AMD_SDW:
9797
channel = dai_get_handshake(dd->dai, dai->direction,
9898
dd->stream_id);
99+
#if defined(CONFIG_SOC_ACP_7_0)
100+
if (channel >= 64 && channel < 128) {
101+
channel = channel - 64;
102+
}
103+
#endif
99104
break;
100105
case SOF_DAI_MEDIATEK_AFE:
101106
handshake = dai_get_handshake(dd->dai, dai->direction,
@@ -188,9 +193,29 @@ int ipc_dai_data_config(struct dai_data *dd, struct comp_dev *dev)
188193
break;
189194
case SOF_DAI_AMD_HS:
190195
case SOF_DAI_AMD_HS_VIRTUAL:
191-
case SOF_DAI_AMD_SW_AUDIO:
192-
dev->ipc_config.frame_fmt = SOF_IPC_FRAME_S16_LE;
196+
case SOF_DAI_AMD_SDW:
197+
#define SDW_INSTANCES 2
198+
#if defined(CONFIG_SOC_ACP_6_0)
199+
break;
200+
#else
201+
struct acp_dma_dev_data *dev_data = dd->dma->z_dev->data;
202+
struct sdw_pin_data *pin_data;
203+
/* Allocate memory only if not already allocated */
204+
if (!dev_data->dai_index_ptr) {
205+
pin_data = rzalloc(SOF_MEM_FLAG_USER | SOF_MEM_FLAG_COHERENT,
206+
sizeof(*pin_data));
207+
dev_data->dai_index_ptr = pin_data;
208+
} else {
209+
pin_data = dev_data->dai_index_ptr;
210+
}
211+
pin_data->pin_num = dd->dai->index;
212+
pin_data->pin_dir = dai->direction;
213+
pin_data->dma_channel = dd->chan ? dd->chan->index : 0xFFFF;
214+
pin_data->index = 0xFFFF;
215+
pin_data->instance = 0xFFFF;
216+
dev_data->dai_index_ptr = pin_data;
193217
break;
218+
#endif
194219
case SOF_DAI_MEDIATEK_AFE:
195220
break;
196221
default:

src/lib/dai.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ const struct device *zephyr_dev[] = {
185185
#if CONFIG_DAI_NXP_MICFIL
186186
DT_FOREACH_STATUS_OKAY(nxp_dai_micfil, GET_DEVICE_LIST)
187187
#endif
188+
#if CONFIG_DAI_AMD_SDW
189+
DT_FOREACH_STATUS_OKAY(amd_sdwdai, GET_DEVICE_LIST)
190+
#endif
188191
};
189192

190193
const struct device **dai_get_device_list(size_t *count)
@@ -224,8 +227,8 @@ static int sof_dai_type_to_zephyr(uint32_t type)
224227
case SOF_DAI_AMD_HS:
225228
case SOF_DAI_AMD_SP_VIRTUAL:
226229
case SOF_DAI_AMD_HS_VIRTUAL:
227-
case SOF_DAI_AMD_SW_AUDIO:
228-
return -ENOTSUP;
230+
case SOF_DAI_AMD_SDW:
231+
return DAI_AMD_SDW;
229232
default:
230233
return -EINVAL;
231234
}
@@ -288,6 +291,10 @@ static void dai_set_device_params(struct dai *d)
288291
d->dma_dev = SOF_DMA_DEV_HDA;
289292
d->dma_caps = SOF_DMA_CAP_HDA;
290293
break;
294+
case SOF_DAI_AMD_SDW:
295+
d->dma_dev = SOF_DMA_DEV_SW;
296+
d->dma_caps = SOF_DMA_CAP_SW;
297+
break;
291298
default:
292299
break;
293300
}

src/platform/amd/acp_7_0/lib/dai.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
// SPDX-License-Identifier: BSD-3-Clause
22
//
3-
//Copyright(c) 2024 AMD. All rights reserved.
3+
//Copyright(c) 2024, 2026 AMD. All rights reserved.
44
//
55
//Author: SaiSurya, Ch <saisurya.chakkaveeravenkatanaga@amd.com>
6+
// Basavaraj Hiregoudar <basavaraj.hiregoudar@amd.com>
7+
// Sivasubramanian <sravisar@amd.com>
68

79
#include <sof/common.h>
810
#include <sof/drivers/acp_dai_dma.h>
@@ -299,7 +301,7 @@ const struct dai_type_info dti[] = {
299301
},
300302
#endif
301303
{
302-
.type = SOF_DAI_AMD_SW_AUDIO,
304+
.type = SOF_DAI_AMD_SDW,
303305
.dai_array = swaudiodai,
304306
.num_dais = ARRAY_SIZE(swaudiodai)
305307
},

zephyr/lib/dma.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,33 @@ SHARED_DATA struct sof_dma dma[] = {
212212
.z_dev = DEVICE_DT_GET(DT_NODELABEL(host_dma)),
213213
},
214214
#endif /* CONFIG_SOC_MIMX9596_M7 */
215+
#if defined(CONFIG_SOC_ACP_7_0)
216+
{
217+
.plat_data = {
218+
.dir = SOF_DMA_DIR_LMEM_TO_HMEM |
219+
SOF_DMA_DIR_HMEM_TO_LMEM,
220+
.devs = SOF_DMA_DEV_HOST,
221+
.base = DMA0_BASE,
222+
.chan_size = DMA0_SIZE,
223+
.channels = 8,
224+
.period_count = 2,
225+
},
226+
.z_dev = DEVICE_DT_GET(DT_NODELABEL(acp_host_dma)),
227+
},
228+
{
229+
.plat_data = {
230+
.dir = SOF_DMA_DIR_MEM_TO_DEV |
231+
SOF_DMA_DIR_DEV_TO_MEM,
232+
.devs = SOF_DMA_DEV_SW,
233+
.caps = SOF_DMA_CAP_SW,
234+
.base = DMA0_BASE,
235+
.chan_size = DMA0_SIZE,
236+
.channels = 12,
237+
.period_count = 2,
238+
},
239+
.z_dev = DEVICE_DT_GET(DT_NODELABEL(acp_sdw_dma)),
240+
},
241+
#endif
215242
};
216243

217244
const struct dma_info lib_dma = {

0 commit comments

Comments
 (0)