Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: SOF: Add DAI configuration support for AMD platforms.

Add support for configuring sp and hs DAI from topology.

Signed-off-by: V sujith kumar Reddy <Vsujithkumar.Reddy@amd.com>
Link: https://lore.kernel.org/r/20221129100102.826781-1-vsujithkumar.reddy@amd.corp-partner.google.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

V sujith kumar Reddy and committed by
Mark Brown
75af4199 aeb2e9c4

+49 -8
+1
include/sound/sof/dai-amd.h
··· 17 17 18 18 uint32_t fsync_rate; /* FSYNC frequency in Hz */ 19 19 uint32_t tdm_slots; 20 + uint32_t tdm_mode; 20 21 } __packed; 21 22 22 23 /* ACPDMIC Configuration Request - SOF_IPC_DAI_AMD_CONFIG */
+2
include/sound/sof/dai.h
··· 86 86 SOF_DAI_AMD_DMIC, /**< AMD ACP DMIC */ 87 87 SOF_DAI_MEDIATEK_AFE, /**< Mediatek AFE */ 88 88 SOF_DAI_AMD_HS, /**< Amd HS */ 89 + SOF_DAI_AMD_SP_VIRTUAL, /**< AMD ACP SP VIRTUAL */ 90 + SOF_DAI_AMD_HS_VIRTUAL, /**< AMD ACP HS VIRTUAL */ 89 91 }; 90 92 91 93 /* general purpose DAI configuration */
+5
include/uapi/sound/sof/tokens.h
··· 198 198 /* COPIER */ 199 199 #define SOF_TKN_INTEL_COPIER_NODE_TYPE 1980 200 200 201 + /* ACP I2S */ 202 + #define SOF_TKN_AMD_ACPI2S_RATE 1700 203 + #define SOF_TKN_AMD_ACPI2S_CH 1701 204 + #define SOF_TKN_AMD_ACPI2S_TDM_MODE 1702 205 + 201 206 #endif
+2
sound/soc/sof/ipc3-pcm.c
··· 336 336 channels->min, channels->max); 337 337 break; 338 338 case SOF_DAI_AMD_SP: 339 + case SOF_DAI_AMD_SP_VIRTUAL: 339 340 rate->min = private->dai_config->acpsp.fsync_rate; 340 341 rate->max = private->dai_config->acpsp.fsync_rate; 341 342 channels->min = private->dai_config->acpsp.tdm_slots; ··· 348 347 channels->min, channels->max); 349 348 break; 350 349 case SOF_DAI_AMD_HS: 350 + case SOF_DAI_AMD_HS_VIRTUAL: 351 351 rate->min = private->dai_config->acphs.fsync_rate; 352 352 rate->max = private->dai_config->acphs.fsync_rate; 353 353 channels->min = private->dai_config->acphs.tdm_slots;
+28 -8
sound/soc/sof/ipc3-topology.c
··· 276 276 offsetof(struct sof_ipc_dai_acpdmic_params, pdm_ch)}, 277 277 }; 278 278 279 + /* ACPI2S */ 280 + static const struct sof_topology_token acpi2s_tokens[] = { 281 + {SOF_TKN_AMD_ACPI2S_RATE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, 282 + offsetof(struct sof_ipc_dai_acp_params, fsync_rate)}, 283 + {SOF_TKN_AMD_ACPI2S_CH, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, 284 + offsetof(struct sof_ipc_dai_acp_params, tdm_slots)}, 285 + {SOF_TKN_AMD_ACPI2S_TDM_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, 286 + offsetof(struct sof_ipc_dai_acp_params, tdm_mode)}, 287 + }; 288 + 279 289 /* Core tokens */ 280 290 static const struct sof_topology_token core_tokens[] = { 281 291 {SOF_TKN_COMP_CORE_ID, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, ··· 321 311 [SOF_SAI_TOKENS] = {"SAI tokens", sai_tokens, ARRAY_SIZE(sai_tokens)}, 322 312 [SOF_AFE_TOKENS] = {"AFE tokens", afe_tokens, ARRAY_SIZE(afe_tokens)}, 323 313 [SOF_ACPDMIC_TOKENS] = {"ACPDMIC tokens", acpdmic_tokens, ARRAY_SIZE(acpdmic_tokens)}, 314 + [SOF_ACPI2S_TOKENS] = {"ACPI2S tokens", acpi2s_tokens, ARRAY_SIZE(acpi2s_tokens)}, 324 315 }; 325 316 326 317 /** ··· 1204 1193 struct snd_soc_tplg_hw_config *hw_config = slink->hw_configs; 1205 1194 struct sof_dai_private_data *private = dai->private; 1206 1195 u32 size = sizeof(*config); 1196 + int ret; 1207 1197 1208 1198 /* handle master/slave and inverted clocks */ 1209 1199 sof_dai_set_format(hw_config, config); ··· 1213 1201 memset(&config->acpsp, 0, sizeof(config->acpsp)); 1214 1202 config->hdr.size = size; 1215 1203 1216 - config->acpsp.fsync_rate = le32_to_cpu(hw_config->fsync_rate); 1217 - config->acpsp.tdm_slots = le32_to_cpu(hw_config->tdm_slots); 1204 + ret = sof_update_ipc_object(scomp, &config->acpsp, SOF_ACPI2S_TOKENS, slink->tuples, 1205 + slink->num_tuples, size, slink->num_hw_configs); 1206 + if (ret < 0) 1207 + return ret; 1218 1208 1219 - dev_info(scomp->dev, "ACP_SP config ACP%d channel %d rate %d\n", 1209 + 1210 + dev_info(scomp->dev, "ACP_SP config ACP%d channel %d rate %d tdm_mode %d\n", 1220 1211 config->dai_index, config->acpsp.tdm_slots, 1221 - config->acpsp.fsync_rate); 1212 + config->acpsp.fsync_rate, config->acpsp.tdm_mode); 1222 1213 1223 1214 dai->number_configs = 1; 1224 1215 dai->current_config = 0; ··· 1238 1223 struct snd_soc_tplg_hw_config *hw_config = slink->hw_configs; 1239 1224 struct sof_dai_private_data *private = dai->private; 1240 1225 u32 size = sizeof(*config); 1226 + int ret; 1241 1227 1242 1228 /* Configures the DAI hardware format and inverted clocks */ 1243 1229 sof_dai_set_format(hw_config, config); ··· 1247 1231 memset(&config->acphs, 0, sizeof(config->acphs)); 1248 1232 config->hdr.size = size; 1249 1233 1250 - config->acphs.fsync_rate = le32_to_cpu(hw_config->fsync_rate); 1251 - config->acphs.tdm_slots = le32_to_cpu(hw_config->tdm_slots); 1234 + ret = sof_update_ipc_object(scomp, &config->acphs, SOF_ACPI2S_TOKENS, slink->tuples, 1235 + slink->num_tuples, size, slink->num_hw_configs); 1236 + if (ret < 0) 1237 + return ret; 1252 1238 1253 - dev_info(scomp->dev, "ACP_HS config ACP%d channel %d rate %d\n", 1239 + dev_info(scomp->dev, "ACP_HS config ACP%d channel %d rate %d tdm_mode %d\n", 1254 1240 config->dai_index, config->acphs.tdm_slots, 1255 - config->acphs.fsync_rate); 1241 + config->acphs.fsync_rate, config->acphs.tdm_mode); 1256 1242 1257 1243 dai->number_configs = 1; 1258 1244 dai->current_config = 0; ··· 1563 1545 ret = sof_link_acp_bt_load(scomp, slink, config, dai); 1564 1546 break; 1565 1547 case SOF_DAI_AMD_SP: 1548 + case SOF_DAI_AMD_SP_VIRTUAL: 1566 1549 ret = sof_link_acp_sp_load(scomp, slink, config, dai); 1567 1550 break; 1568 1551 case SOF_DAI_AMD_HS: 1552 + case SOF_DAI_AMD_HS_VIRTUAL: 1569 1553 ret = sof_link_acp_hs_load(scomp, slink, config, dai); 1570 1554 break; 1571 1555 case SOF_DAI_AMD_DMIC:
+1
sound/soc/sof/sof-audio.h
··· 248 248 SOF_COPIER_FORMAT_TOKENS, 249 249 SOF_GAIN_TOKENS, 250 250 SOF_ACPDMIC_TOKENS, 251 + SOF_ACPI2S_TOKENS, 251 252 252 253 /* this should be the last */ 253 254 SOF_TOKEN_COUNT,
+10
sound/soc/sof/topology.c
··· 289 289 {"ACPDMIC", SOF_DAI_AMD_DMIC}, 290 290 {"ACPHS", SOF_DAI_AMD_HS}, 291 291 {"AFE", SOF_DAI_MEDIATEK_AFE}, 292 + {"ACPSP_VIRTUAL", SOF_DAI_AMD_SP_VIRTUAL}, 293 + {"ACPHS_VIRTUAL", SOF_DAI_AMD_HS_VIRTUAL}, 294 + 292 295 }; 293 296 294 297 static enum sof_ipc_dai_type find_dai(const char *name) ··· 1897 1894 case SOF_DAI_AMD_DMIC: 1898 1895 token_id = SOF_ACPDMIC_TOKENS; 1899 1896 num_tuples += token_list[SOF_ACPDMIC_TOKENS].count; 1897 + break; 1898 + case SOF_DAI_AMD_SP: 1899 + case SOF_DAI_AMD_HS: 1900 + case SOF_DAI_AMD_SP_VIRTUAL: 1901 + case SOF_DAI_AMD_HS_VIRTUAL: 1902 + token_id = SOF_ACPI2S_TOKENS; 1903 + num_tuples += token_list[SOF_ACPI2S_TOKENS].count; 1900 1904 break; 1901 1905 default: 1902 1906 break;