|
@@ -496,11 +496,6 @@ static int skl_link_pcm_prepare(struct snd_pcm_substream *substream,
|
|
|
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
|
|
struct hdac_ext_link *link;
|
|
|
|
|
|
- if (link_dev->link_prepared) {
|
|
|
- dev_dbg(dai->dev, "already stream is prepared - returning\n");
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
dma_params = (struct skl_dma_params *)
|
|
|
snd_soc_dai_get_dma_data(codec_dai, substream);
|
|
|
if (dma_params)
|
|
@@ -508,14 +503,15 @@ static int skl_link_pcm_prepare(struct snd_pcm_substream *substream,
|
|
|
dev_dbg(dai->dev, "stream_tag=%d formatvalue=%d codec_dai_name=%s\n",
|
|
|
hdac_stream(link_dev)->stream_tag, format_val, codec_dai->name);
|
|
|
|
|
|
- snd_hdac_ext_link_stream_reset(link_dev);
|
|
|
-
|
|
|
- snd_hdac_ext_link_stream_setup(link_dev, format_val);
|
|
|
-
|
|
|
link = snd_hdac_ext_bus_get_link(ebus, rtd->codec->component.name);
|
|
|
if (!link)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ snd_hdac_ext_bus_link_power_up(link);
|
|
|
+ snd_hdac_ext_link_stream_reset(link_dev);
|
|
|
+
|
|
|
+ snd_hdac_ext_link_stream_setup(link_dev, format_val);
|
|
|
+
|
|
|
snd_hdac_ext_link_set_stream_id(link, hdac_stream(link_dev)->stream_tag);
|
|
|
link_dev->link_prepared = 1;
|
|
|
|
|
@@ -527,12 +523,16 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
|
|
|
{
|
|
|
struct hdac_ext_stream *link_dev =
|
|
|
snd_soc_dai_get_dma_data(dai, substream);
|
|
|
+ struct hdac_ext_bus *ebus = get_bus_ctx(substream);
|
|
|
+ struct hdac_ext_stream *stream = get_hdac_ext_stream(substream);
|
|
|
|
|
|
dev_dbg(dai->dev, "In %s cmd=%d\n", __func__, cmd);
|
|
|
switch (cmd) {
|
|
|
+ case SNDRV_PCM_TRIGGER_RESUME:
|
|
|
+ skl_link_pcm_prepare(substream, dai);
|
|
|
case SNDRV_PCM_TRIGGER_START:
|
|
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
|
- case SNDRV_PCM_TRIGGER_RESUME:
|
|
|
+ snd_hdac_ext_stream_decouple(ebus, stream, true);
|
|
|
snd_hdac_ext_link_stream_start(link_dev);
|
|
|
break;
|
|
|
|
|
@@ -540,6 +540,8 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
|
|
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
|
|
case SNDRV_PCM_TRIGGER_STOP:
|
|
|
snd_hdac_ext_link_stream_clear(link_dev);
|
|
|
+ if (cmd == SNDRV_PCM_TRIGGER_SUSPEND)
|
|
|
+ snd_hdac_ext_stream_decouple(ebus, stream, false);
|
|
|
break;
|
|
|
|
|
|
default:
|