| From 9f41863a8c54c23ffe8d066132dd7bbd0931d5c0 Mon Sep 17 00:00:00 2001 |
| From: V sujith kumar Reddy <Vsujithkumar.Reddy@amd.com> |
| Date: Wed, 12 Oct 2022 14:57:11 +0530 |
| Subject: [PATCH] CHROMIUM: ASoC: SOF: Add DAI configuration support for AMD |
| platforms. |
| |
| Add support for configuring sp and hs DAI from topology. |
| |
| BUG=b:203820382 |
| TEST=Tested on Skyrim |
| |
| Change-Id: Iac81c9a2fed47e856cf2719c43f1d1986259cb6b |
| Signed-off-by: V sujith kumar Reddy <vsujithkumar.reddy@amd.corp-partner.google.com> |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3960174 |
| Commit-Queue: Baili Deng <bailideng@google.com> |
| Reviewed-by: Baili Deng <bailideng@google.com> |
| Reviewed-by: Curtis Malainey <cujomalainey@chromium.org> |
| Tested-by: Baili Deng <bailideng@google.com> |
| --- |
| include/sound/sof/dai-amd.h | 1 + |
| include/sound/sof/dai.h | 2 ++ |
| include/uapi/sound/sof/tokens.h | 5 +++++ |
| sound/soc/sof/ipc3-pcm.c | 2 ++ |
| sound/soc/sof/ipc3-topology.c | 36 +++++++++++++++++++++++++-------- |
| sound/soc/sof/sof-audio.h | 2 +- |
| sound/soc/sof/topology.c | 10 +++++++++ |
| 7 files changed, 49 insertions(+), 9 deletions(-) |
| |
| diff --git a/include/sound/sof/dai-amd.h b/include/sound/sof/dai-amd.h |
| index 92f45c180b7cce419523b4cf3479d95fcf541fe1..9df7ac824efea6c65baa7dc77f0ac8b5bd8dd317 100644 |
| --- a/include/sound/sof/dai-amd.h |
| +++ b/include/sound/sof/dai-amd.h |
| @@ -17,6 +17,7 @@ struct sof_ipc_dai_acp_params { |
| |
| uint32_t fsync_rate; /* FSYNC frequency in Hz */ |
| uint32_t tdm_slots; |
| + uint32_t tdm_mode; |
| } __packed; |
| |
| /* ACPDMIC Configuration Request - SOF_IPC_DAI_AMD_CONFIG */ |
| diff --git a/include/sound/sof/dai.h b/include/sound/sof/dai.h |
| index 9fbd3832bcdc7ab937c5bc049efa110774a2285e..3041f5805b7bde3ee72b1a7fba3a95bc6428cf09 100644 |
| --- a/include/sound/sof/dai.h |
| +++ b/include/sound/sof/dai.h |
| @@ -86,6 +86,8 @@ enum sof_ipc_dai_type { |
| SOF_DAI_AMD_DMIC, /**< AMD ACP DMIC */ |
| SOF_DAI_MEDIATEK_AFE, /**< Mediatek AFE */ |
| SOF_DAI_AMD_HS, /**< Amd HS */ |
| + SOF_DAI_AMD_SP_VIRTUAL, /**< AMD ACP SP VIRTUAL */ |
| + SOF_DAI_AMD_HS_VIRTUAL, /**< AMD ACP HS VIRTUAL */ |
| }; |
| |
| /* general purpose DAI configuration */ |
| diff --git a/include/uapi/sound/sof/tokens.h b/include/uapi/sound/sof/tokens.h |
| index 5caf75cadaf8c3216e4cf4f0efec487bc113f99a..6a4a49d0d2f29661add1879e2783eb155a8599c3 100644 |
| --- a/include/uapi/sound/sof/tokens.h |
| +++ b/include/uapi/sound/sof/tokens.h |
| @@ -189,4 +189,9 @@ |
| /* COPIER */ |
| #define SOF_TKN_INTEL_COPIER_NODE_TYPE 1980 |
| |
| +/* ACP I2S */ |
| +#define SOF_TKN_AMD_ACPI2S_RATE 1700 |
| +#define SOF_TKN_AMD_ACPI2S_CH 1701 |
| +#define SOF_TKN_AMD_ACPI2S_TDM_MODE 1702 |
| + |
| #endif |
| diff --git a/sound/soc/sof/ipc3-pcm.c b/sound/soc/sof/ipc3-pcm.c |
| index dad57bef38f6d03273d5528fc855eb7856d67d44..f10bfc9bd5cb41b61b20cf01ebb3b4d4c104d382 100644 |
| --- a/sound/soc/sof/ipc3-pcm.c |
| +++ b/sound/soc/sof/ipc3-pcm.c |
| @@ -336,6 +336,7 @@ static int sof_ipc3_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, |
| channels->min, channels->max); |
| break; |
| case SOF_DAI_AMD_SP: |
| + case SOF_DAI_AMD_SP_VIRTUAL: |
| rate->min = private->dai_config->acpsp.fsync_rate; |
| rate->max = private->dai_config->acpsp.fsync_rate; |
| channels->min = private->dai_config->acpsp.tdm_slots; |
| @@ -347,6 +348,7 @@ static int sof_ipc3_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, |
| channels->min, channels->max); |
| break; |
| case SOF_DAI_AMD_HS: |
| + case SOF_DAI_AMD_HS_VIRTUAL: |
| rate->min = private->dai_config->acphs.fsync_rate; |
| rate->max = private->dai_config->acphs.fsync_rate; |
| channels->min = private->dai_config->acphs.tdm_slots; |
| diff --git a/sound/soc/sof/ipc3-topology.c b/sound/soc/sof/ipc3-topology.c |
| index 0720e1eae08439f9bf795dae18af013cca27b5bb..b94cc40485ed6d6e207f0cdec2e55bd944378654 100644 |
| --- a/sound/soc/sof/ipc3-topology.c |
| +++ b/sound/soc/sof/ipc3-topology.c |
| @@ -276,6 +276,16 @@ static const struct sof_topology_token acpdmic_tokens[] = { |
| offsetof(struct sof_ipc_dai_acpdmic_params, pdm_ch)}, |
| }; |
| |
| +/* ACPI2S */ |
| +static const struct sof_topology_token acpi2s_tokens[] = { |
| + {SOF_TKN_AMD_ACPI2S_RATE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, |
| + offsetof(struct sof_ipc_dai_acp_params, fsync_rate)}, |
| + {SOF_TKN_AMD_ACPI2S_CH, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, |
| + offsetof(struct sof_ipc_dai_acp_params, tdm_slots)}, |
| + {SOF_TKN_AMD_ACPI2S_TDM_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, |
| + offsetof(struct sof_ipc_dai_acp_params, tdm_mode)}, |
| +}; |
| + |
| /* Core tokens */ |
| static const struct sof_topology_token core_tokens[] = { |
| {SOF_TKN_COMP_CORE_ID, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, |
| @@ -311,6 +321,7 @@ static const struct sof_token_info ipc3_token_list[SOF_TOKEN_COUNT] = { |
| [SOF_SAI_TOKENS] = {"SAI tokens", sai_tokens, ARRAY_SIZE(sai_tokens)}, |
| [SOF_AFE_TOKENS] = {"AFE tokens", afe_tokens, ARRAY_SIZE(afe_tokens)}, |
| [SOF_ACPDMIC_TOKENS] = {"ACPDMIC tokens", acpdmic_tokens, ARRAY_SIZE(acpdmic_tokens)}, |
| + [SOF_ACPI2S_TOKENS] = {"ACPI2S tokens", acpi2s_tokens, ARRAY_SIZE(acpi2s_tokens)}, |
| }; |
| |
| /** |
| @@ -1193,6 +1204,7 @@ static int sof_link_acp_sp_load(struct snd_soc_component *scomp, struct snd_sof_ |
| struct snd_soc_tplg_hw_config *hw_config = slink->hw_configs; |
| struct sof_dai_private_data *private = dai->private; |
| u32 size = sizeof(*config); |
| + int ret; |
| |
| /* handle master/slave and inverted clocks */ |
| sof_dai_set_format(hw_config, config); |
| @@ -1201,12 +1213,15 @@ static int sof_link_acp_sp_load(struct snd_soc_component *scomp, struct snd_sof_ |
| memset(&config->acpsp, 0, sizeof(config->acpsp)); |
| config->hdr.size = size; |
| |
| - config->acpsp.fsync_rate = le32_to_cpu(hw_config->fsync_rate); |
| - config->acpsp.tdm_slots = le32_to_cpu(hw_config->tdm_slots); |
| + ret = sof_update_ipc_object(scomp, &config->acpsp, SOF_ACPI2S_TOKENS, slink->tuples, |
| + slink->num_tuples, size, slink->num_hw_configs); |
| + if (ret < 0) |
| + return ret; |
| |
| - dev_info(scomp->dev, "ACP_SP config ACP%d channel %d rate %d\n", |
| + |
| + dev_info(scomp->dev, "ACP_SP config ACP%d channel %d rate %d tdm_mode %d\n", |
| config->dai_index, config->acpsp.tdm_slots, |
| - config->acpsp.fsync_rate); |
| + config->acpsp.fsync_rate, config->acpsp.tdm_mode); |
| |
| dai->number_configs = 1; |
| dai->current_config = 0; |
| @@ -1223,6 +1238,7 @@ static int sof_link_acp_hs_load(struct snd_soc_component *scomp, struct snd_sof_ |
| struct snd_soc_tplg_hw_config *hw_config = slink->hw_configs; |
| struct sof_dai_private_data *private = dai->private; |
| u32 size = sizeof(*config); |
| + int ret; |
| |
| /* Configures the DAI hardware format and inverted clocks */ |
| sof_dai_set_format(hw_config, config); |
| @@ -1231,12 +1247,14 @@ static int sof_link_acp_hs_load(struct snd_soc_component *scomp, struct snd_sof_ |
| memset(&config->acphs, 0, sizeof(config->acphs)); |
| config->hdr.size = size; |
| |
| - config->acphs.fsync_rate = le32_to_cpu(hw_config->fsync_rate); |
| - config->acphs.tdm_slots = le32_to_cpu(hw_config->tdm_slots); |
| + ret = sof_update_ipc_object(scomp, &config->acphs, SOF_ACPI2S_TOKENS, slink->tuples, |
| + slink->num_tuples, size, slink->num_hw_configs); |
| + if (ret < 0) |
| + return ret; |
| |
| - dev_info(scomp->dev, "ACP_HS config ACP%d channel %d rate %d\n", |
| + dev_info(scomp->dev, "ACP_HS config ACP%d channel %d rate %d tdm_mode %d\n", |
| config->dai_index, config->acphs.tdm_slots, |
| - config->acphs.fsync_rate); |
| + config->acphs.fsync_rate, config->acphs.tdm_mode); |
| |
| dai->number_configs = 1; |
| dai->current_config = 0; |
| @@ -1545,9 +1563,11 @@ static int sof_ipc3_widget_setup_comp_dai(struct snd_sof_widget *swidget) |
| ret = sof_link_acp_bt_load(scomp, slink, config, dai); |
| break; |
| case SOF_DAI_AMD_SP: |
| + case SOF_DAI_AMD_SP_VIRTUAL: |
| ret = sof_link_acp_sp_load(scomp, slink, config, dai); |
| break; |
| case SOF_DAI_AMD_HS: |
| + case SOF_DAI_AMD_HS_VIRTUAL: |
| ret = sof_link_acp_hs_load(scomp, slink, config, dai); |
| break; |
| case SOF_DAI_AMD_DMIC: |
| diff --git a/sound/soc/sof/sof-audio.h b/sound/soc/sof/sof-audio.h |
| index 4284ea2f3a1ff2275a7a939e6cdd94f50f7f6824..9ddacac28c32e1884ae041ea3959618f0cb2836e 100644 |
| --- a/sound/soc/sof/sof-audio.h |
| +++ b/sound/soc/sof/sof-audio.h |
| @@ -237,7 +237,7 @@ enum sof_tokens { |
| SOF_COPIER_FORMAT_TOKENS, |
| SOF_GAIN_TOKENS, |
| SOF_ACPDMIC_TOKENS, |
| - |
| + SOF_ACPI2S_TOKENS, |
| /* this should be the last */ |
| SOF_TOKEN_COUNT, |
| }; |
| diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c |
| index 6a0e7f3b5023440e90006d8b1ca5d413445ddb95..7491021e0521fa7719437fb79060b181985fc8b2 100644 |
| --- a/sound/soc/sof/topology.c |
| +++ b/sound/soc/sof/topology.c |
| @@ -289,6 +289,9 @@ static const struct sof_dai_types sof_dais[] = { |
| {"ACPDMIC", SOF_DAI_AMD_DMIC}, |
| {"ACPHS", SOF_DAI_AMD_HS}, |
| {"AFE", SOF_DAI_MEDIATEK_AFE}, |
| + {"ACPSP_VIRTUAL", SOF_DAI_AMD_SP_VIRTUAL}, |
| + {"ACPHS_VIRTUAL", SOF_DAI_AMD_HS_VIRTUAL}, |
| + |
| }; |
| |
| static enum sof_ipc_dai_type find_dai(const char *name) |
| @@ -1734,6 +1737,13 @@ static int sof_link_load(struct snd_soc_component *scomp, int index, struct snd_ |
| token_id = SOF_ACPDMIC_TOKENS; |
| num_tuples += token_list[SOF_ACPDMIC_TOKENS].count; |
| break; |
| + case SOF_DAI_AMD_SP: |
| + case SOF_DAI_AMD_HS: |
| + case SOF_DAI_AMD_SP_VIRTUAL: |
| + case SOF_DAI_AMD_HS_VIRTUAL: |
| + token_id = SOF_ACPI2S_TOKENS; |
| + num_tuples += token_list[SOF_ACPI2S_TOKENS].count; |
| + break; |
| default: |
| break; |
| } |
| -- |
| 2.38.1.584.g0f3c55d4c2-goog |
| |