Skip to content

Commit ed7280f

Browse files
ASoC: SOF: amd: add ACP7x I2S DAI type and topology support
Add SOF_DAI_AMD_I2S DAI type for ACP7.B/7.F I2S/TDM interfaces. Register ACPTDM DAI name in topology and SOF_ACPI2S_TOKENS as the token group. Add sof_link_acp_i2s_load() IPC3 topology loader and SOF_DAI_AMD_I2S case for PCM dai link fixup. Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
1 parent 886c158 commit ed7280f

4 files changed

Lines changed: 42 additions & 1 deletion

File tree

include/sound/sof/dai.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ enum sof_ipc_dai_type {
9191
SOF_DAI_IMX_MICFIL, /** < i.MX MICFIL PDM */
9292
SOF_DAI_AMD_SDW, /**< AMD ACP SDW */
9393
SOF_DAI_INTEL_UAOL, /**< Intel UAOL */
94+
SOF_DAI_AMD_I2S, /**< AMD ACP I2S */
9495
};
9596

9697
/* general purpose DAI configuration */
@@ -122,6 +123,7 @@ struct sof_ipc_dai_config {
122123
struct sof_ipc_dai_mtk_afe_params afe;
123124
struct sof_ipc_dai_micfil_params micfil;
124125
struct sof_ipc_dai_acp_sdw_params acp_sdw;
126+
struct sof_ipc_dai_acp_params acp_i2s;
125127
};
126128
} __packed;
127129

sound/soc/sof/ipc3-pcm.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,12 @@ static int sof_ipc3_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
421421
dev_dbg(component->dev, "AMD_SDW channels_min: %d channels_max: %d\n",
422422
channels->min, channels->max);
423423
break;
424+
case SOF_DAI_AMD_I2S:
425+
rate->min = private->dai_config->acp_i2s.fsync_rate;
426+
rate->max = private->dai_config->acp_i2s.fsync_rate;
427+
channels->min = private->dai_config->acp_i2s.tdm_slots;
428+
channels->max = private->dai_config->acp_i2s.tdm_slots;
429+
break;
424430
default:
425431
dev_err(component->dev, "Invalid DAI type %d\n", private->dai_config->type);
426432
break;

sound/soc/sof/ipc3-topology.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,6 +1365,35 @@ static int sof_link_acp_sdw_load(struct snd_soc_component *scomp, struct snd_sof
13651365
return 0;
13661366
}
13671367

1368+
static int sof_link_acp_i2s_load(struct snd_soc_component *scomp, struct snd_sof_dai_link *slink,
1369+
struct sof_ipc_dai_config *config, struct snd_sof_dai *dai)
1370+
{
1371+
struct snd_soc_tplg_hw_config *hw_config = slink->hw_configs;
1372+
struct sof_dai_private_data *private = dai->private;
1373+
u32 size = sizeof(*config);
1374+
int ret;
1375+
1376+
/* handle master/slave and inverted clocks */
1377+
sof_dai_set_format(hw_config, config);
1378+
1379+
/* init IPC */
1380+
memset(&config->acp_i2s, 0, sizeof(config->acp_i2s));
1381+
config->hdr.size = size;
1382+
1383+
ret = sof_update_ipc_object(scomp, &config->acp_i2s, SOF_ACPI2S_TOKENS, slink->tuples,
1384+
slink->num_tuples, size, slink->num_hw_configs);
1385+
if (ret < 0)
1386+
return ret;
1387+
1388+
dai->number_configs = 1;
1389+
dai->current_config = 0;
1390+
private->dai_config = kmemdup(config, size, GFP_KERNEL);
1391+
if (!private->dai_config)
1392+
return -ENOMEM;
1393+
1394+
return 0;
1395+
}
1396+
13681397
static int sof_link_afe_load(struct snd_soc_component *scomp, struct snd_sof_dai_link *slink,
13691398
struct sof_ipc_dai_config *config, struct snd_sof_dai *dai)
13701399
{
@@ -1694,6 +1723,9 @@ static int sof_ipc3_widget_setup_comp_dai(struct snd_sof_widget *swidget)
16941723
case SOF_DAI_AMD_SDW:
16951724
ret = sof_link_acp_sdw_load(scomp, slink, config, dai);
16961725
break;
1726+
case SOF_DAI_AMD_I2S:
1727+
ret = sof_link_acp_i2s_load(scomp, slink, config, dai);
1728+
break;
16971729
default:
16981730
break;
16991731
}

sound/soc/sof/topology.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ static const struct sof_dai_types sof_dais[] = {
309309
{"ACPHS_VIRTUAL", SOF_DAI_AMD_HS_VIRTUAL},
310310
{"MICFIL", SOF_DAI_IMX_MICFIL},
311311
{"ACP_SDW", SOF_DAI_AMD_SDW},
312-
312+
{"ACPTDM", SOF_DAI_AMD_I2S},
313313
};
314314

315315
static enum sof_ipc_dai_type find_dai(const char *name)
@@ -1992,6 +1992,7 @@ static int sof_link_load(struct snd_soc_component *scomp, int index, struct snd_
19921992
case SOF_DAI_AMD_HS:
19931993
case SOF_DAI_AMD_SP_VIRTUAL:
19941994
case SOF_DAI_AMD_HS_VIRTUAL:
1995+
case SOF_DAI_AMD_I2S:
19951996
token_id = SOF_ACPI2S_TOKENS;
19961997
num_tuples += token_list[SOF_ACPI2S_TOKENS].count;
19971998
break;

0 commit comments

Comments
 (0)