OSDN Git Service

ASoC: SOF: Intel: hda: fix stream id setting
authorRander Wang <rander.wang@linux.intel.com>
Mon, 22 Jul 2019 14:14:00 +0000 (09:14 -0500)
committerMark Brown <broonie@kernel.org>
Tue, 23 Jul 2019 11:25:31 +0000 (12:25 +0100)
snd_hdac_ext_link_clear_stream_id maps stream id to
link output, which is for playback, not capture.

Tested on Whiskey Lake platform.

Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20190722141402.7194-20-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-dai.c
sound/soc/sof/intel/hda-dsp.c

index 2b5e2b8..8796f38 100644 (file)
@@ -327,8 +327,12 @@ static int hda_link_pcm_trigger(struct snd_pcm_substream *substream,
                                          DMA_CHAN_INVALID, substream->stream);
                if (ret < 0)
                        return ret;
-               stream_tag = hdac_stream(link_dev)->stream_tag;
-               snd_hdac_ext_link_clear_stream_id(link, stream_tag);
+
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+                       stream_tag = hdac_stream(link_dev)->stream_tag;
+                       snd_hdac_ext_link_clear_stream_id(link, stream_tag);
+               }
+
                link_dev->link_prepared = 0;
 
                /* fallthrough */
@@ -369,8 +373,11 @@ static int hda_link_hw_free(struct snd_pcm_substream *substream,
        if (!link)
                return -EINVAL;
 
-       stream_tag = hdac_stream(link_dev)->stream_tag;
-       snd_hdac_ext_link_clear_stream_id(link, stream_tag);
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+               stream_tag = hdac_stream(link_dev)->stream_tag;
+               snd_hdac_ext_link_clear_stream_id(link, stream_tag);
+       }
+
        snd_soc_dai_set_dma_data(dai, substream, NULL);
        snd_hdac_ext_stream_release(link_dev, HDAC_EXT_STREAM_TYPE_LINK);
        link_dev->link_prepared = 0;
index e380081..fb55a3c 100644 (file)
@@ -450,9 +450,15 @@ int hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev)
                        link = snd_hdac_ext_bus_get_link(bus, name);
                        if (!link)
                                return -EINVAL;
+
+                       stream->link_prepared = 0;
+
+                       if (hdac_stream(stream)->direction ==
+                               SNDRV_PCM_STREAM_CAPTURE)
+                               continue;
+
                        stream_tag = hdac_stream(stream)->stream_tag;
                        snd_hdac_ext_link_clear_stream_id(link, stream_tag);
-                       stream->link_prepared = 0;
                }
        }
 #endif