ASoC: Intel: Skylake: Update link_index and format in pipe params
authorJeeja KP <jeeja.kp@intel.com>
Thu, 8 Dec 2016 08:11:12 +0000 (13:41 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 15 Dec 2016 12:15:59 +0000 (12:15 +0000)
To configure Host/Link DMA, additionally link index and format
are required based on the hw params. So added these parameters in
the pipe params and in hw_params the pipe params are updated.

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.h

index 84b5101e6ca691df0e0896b59a95e07a55e3b5e7..105aab7593c8eee0ff78a94ff2a019ad7a78a9df 100644 (file)
@@ -292,6 +292,7 @@ static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
        p_params.s_freq = params_rate(params);
        p_params.host_dma_id = dma_id;
        p_params.stream = substream->stream;
+       p_params.format = params_format(params);
 
        m_cfg = skl_tplg_fe_get_cpr_module(dai, p_params.stream);
        if (m_cfg)
@@ -506,6 +507,7 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
        struct hdac_ext_dma_params *dma_params;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct skl_pipe_params p_params = {0};
+       struct hdac_ext_link *link;
 
        link_dev = snd_hdac_ext_stream_assign(ebus, substream,
                                        HDAC_EXT_STREAM_TYPE_LINK);
@@ -514,6 +516,10 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
 
        snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev);
 
+       link = snd_hdac_ext_bus_get_link(ebus, rtd->codec->component.name);
+       if (!link)
+               return -EINVAL;
+
        /* set the stream tag in the codec dai dma params  */
        dma_params = snd_soc_dai_get_dma_data(codec_dai, substream);
        if (dma_params)
@@ -524,6 +530,8 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
        p_params.s_freq = params_rate(params);
        p_params.stream = substream->stream;
        p_params.link_dma_id = hdac_stream(link_dev)->stream_tag - 1;
+       p_params.link_index = link->index;
+       p_params.format = params_format(params);
 
        return skl_tplg_be_update_params(dai, &p_params);
 }
index eb440cd9a2a4ddfea6aee83901bc413ae416f2ea..8f608c45e4456a741efcf65a6591af0a41414a4f 100644 (file)
@@ -1206,6 +1206,7 @@ static void skl_tplg_fill_dma_id(struct skl_module_cfg *mcfg,
                switch (mcfg->dev_type) {
                case SKL_DEVICE_HDALINK:
                        pipe->p_params->link_dma_id = params->link_dma_id;
+                       pipe->p_params->link_index = params->link_index;
                        break;
 
                case SKL_DEVICE_HDAHOST:
@@ -1219,6 +1220,7 @@ static void skl_tplg_fill_dma_id(struct skl_module_cfg *mcfg,
                pipe->p_params->ch = params->ch;
                pipe->p_params->s_freq = params->s_freq;
                pipe->p_params->stream = params->stream;
+               pipe->p_params->format = params->format;
 
        } else {
                memcpy(pipe->p_params, params, sizeof(*params));
index 08d39280b07bcd09bd3a62c7de4f99ba7290add3..405765f3a6b5b30058f7b5fa822b6cb349c15477 100644 (file)
@@ -254,6 +254,8 @@ struct skl_pipe_params {
        u32 s_freq;
        u32 s_fmt;
        u8 linktype;
+       snd_pcm_format_t format;
+       int link_index;
        int stream;
 };