ASoC: SOF: topology: initial support for Intel ALH DAI type
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Thu, 15 Aug 2019 19:20:17 +0000 (14:20 -0500)
committerMark Brown <broonie@kernel.org>
Fri, 16 Aug 2019 12:13:39 +0000 (13:13 +0100)
The Audio Link Hub DAI does not require any static configuration from
topology for now. We still need to pass the frame rate and format to
firmware.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20190815192018.30570-4-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/topology.c

index a215bf58b138f7db9295b3dde20eb974462f365e..28a7a6e06a539531333a758c07cc557cd3adfa9c 100644 (file)
@@ -346,6 +346,7 @@ static const struct sof_dai_types sof_dais[] = {
        {"SSP", SOF_DAI_INTEL_SSP},
        {"HDA", SOF_DAI_INTEL_HDA},
        {"DMIC", SOF_DAI_INTEL_DMIC},
+       {"ALH", SOF_DAI_INTEL_ALH},
        {"SAI", SOF_DAI_IMX_SAI},
        {"ESAI", SOF_DAI_IMX_ESAI},
 };
@@ -2763,6 +2764,40 @@ static int sof_link_hda_load(struct snd_soc_component *scomp, int index,
        return ret;
 }
 
+static int sof_link_alh_load(struct snd_soc_component *scomp, int index,
+                            struct snd_soc_dai_link *link,
+                            struct snd_soc_tplg_link_config *cfg,
+                            struct snd_soc_tplg_hw_config *hw_config,
+                            struct sof_ipc_dai_config *config)
+{
+       struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
+       struct sof_ipc_reply reply;
+       u32 size = sizeof(*config);
+       int ret;
+
+       /* init IPC */
+       config->hdr.size = size;
+
+       /* send message to DSP */
+       ret = sof_ipc_tx_message(sdev->ipc,
+                                config->hdr.cmd, config, size, &reply,
+                                sizeof(reply));
+
+       if (ret < 0) {
+               dev_err(sdev->dev, "error: failed to set DAI config for ALH %d\n",
+                       config->dai_index);
+               return ret;
+       }
+
+       /* set config for all DAI's with name matching the link name */
+       ret = sof_set_dai_config(sdev, size, link, config);
+       if (ret < 0)
+               dev_err(sdev->dev, "error: failed to save DAI config for ALH %d\n",
+                       config->dai_index);
+
+       return ret;
+}
+
 /* DAI link - used for any driver specific init */
 static int sof_link_load(struct snd_soc_component *scomp, int index,
                         struct snd_soc_dai_link *link,
@@ -2859,6 +2894,10 @@ static int sof_link_load(struct snd_soc_component *scomp, int index,
                ret = sof_link_hda_load(scomp, index, link, cfg, hw_config,
                                        &config);
                break;
+       case SOF_DAI_INTEL_ALH:
+               ret = sof_link_alh_load(scomp, index, link, cfg, hw_config,
+                                       &config);
+               break;
        case SOF_DAI_IMX_SAI:
                ret = sof_link_sai_load(scomp, index, link, cfg, hw_config,
                                        &config);
@@ -2924,7 +2963,8 @@ found:
        switch (sof_dai->dai_config->type) {
        case SOF_DAI_INTEL_SSP:
        case SOF_DAI_INTEL_DMIC:
-               /* no resource needs to be released for SSP and DMIC */
+       case SOF_DAI_INTEL_ALH:
+               /* no resource needs to be released for SSP, DMIC and ALH */
                break;
        case SOF_DAI_INTEL_HDA:
                ret = sof_link_hda_unload(sdev, link);