ASoC: SOF: topology: Get ALH rate amd channels from topology
authorBard Liao <yung-chuan.liao@linux.intel.com>
Wed, 15 Apr 2020 20:28:12 +0000 (15:28 -0500)
committerMark Brown <broonie@kernel.org>
Wed, 15 Apr 2020 23:23:15 +0000 (00:23 +0100)
FW will need these params for synchronized playback over multiple
DAIs.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: SÅ‚awomir BÅ‚auciak <slawomir.blauciak@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20200415202816.934-21-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/uapi/sound/sof/tokens.h
sound/soc/sof/topology.c

index 2a25cd8..b7ad1cd 100644 (file)
 #define SOF_TKN_MUTE_LED_USE                   1300
 #define SOF_TKN_MUTE_LED_DIRECTION             1301
 
+/* ALH */
+#define SOF_TKN_INTEL_ALH_RATE                 1400
+#define SOF_TKN_INTEL_ALH_CH                   1401
+
 #endif
index 3670b42..f59c34b 100644 (file)
@@ -656,6 +656,16 @@ static const struct sof_topology_token ssp_tokens[] = {
 
 };
 
+/* ALH */
+static const struct sof_topology_token alh_tokens[] = {
+       {SOF_TKN_INTEL_ALH_RATE,
+               SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+               offsetof(struct sof_ipc_dai_alh_params, rate), 0},
+       {SOF_TKN_INTEL_ALH_CH,
+               SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+               offsetof(struct sof_ipc_dai_alh_params, channels), 0},
+};
+
 /* DMIC */
 static const struct sof_topology_token dmic_tokens[] = {
        {SOF_TKN_INTEL_DMIC_DRIVER_VERSION,
@@ -3095,13 +3105,26 @@ static int sof_link_alh_load(struct snd_soc_component *scomp, int index,
                             struct sof_ipc_dai_config *config)
 {
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
+       struct snd_soc_tplg_private *private = &cfg->priv;
        struct sof_ipc_reply reply;
        u32 size = sizeof(*config);
        int ret;
 
+       ret = sof_parse_tokens(scomp, &config->alh, alh_tokens,
+                              ARRAY_SIZE(alh_tokens), private->array,
+                              le32_to_cpu(private->size));
+       if (ret != 0) {
+               dev_err(scomp->dev, "error: parse alh tokens failed %d\n",
+                       le32_to_cpu(private->size));
+               return ret;
+       }
+
        /* init IPC */
        config->hdr.size = size;
 
+       dev_dbg(scomp->dev, "ALH config rate %d channels %d\n",
+               config->alh.rate, config->alh.channels);
+
        /* send message to DSP */
        ret = sof_ipc_tx_message(sdev->ipc,
                                 config->hdr.cmd, config, size, &reply,