summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/soc-compress.c4
-rw-r--r--sound/soc/soc-link.c11
2 files changed, 12 insertions, 3 deletions
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
index 8b6a6bd482d1..6de22b2f8197 100644
--- a/sound/soc/soc-compress.c
+++ b/sound/soc/soc-compress.c
@@ -41,7 +41,7 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
if (!snd_soc_dai_active(codec_dai))
codec_dai->rate = 0;
- snd_soc_link_compr_shutdown(cstream);
+ snd_soc_link_compr_shutdown(cstream, 0);
snd_soc_component_compr_free(cstream, 0);
@@ -205,7 +205,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
fe->dpcm[stream].runtime = NULL;
- snd_soc_link_compr_shutdown(cstream);
+ snd_soc_link_compr_shutdown(cstream, 0);
snd_soc_component_compr_free(cstream, 0);
diff --git a/sound/soc/soc-link.c b/sound/soc/soc-link.c
index 409ae4940da3..26cc60f8dcfb 100644
--- a/sound/soc/soc-link.c
+++ b/sound/soc/soc-link.c
@@ -162,17 +162,26 @@ int snd_soc_link_compr_startup(struct snd_compr_stream *cstream)
rtd->dai_link->compr_ops->startup)
ret = rtd->dai_link->compr_ops->startup(cstream);
+ if (ret == 0)
+ soc_link_mark_push(rtd, cstream, compr_startup);
+
return soc_link_ret(rtd, ret);
}
EXPORT_SYMBOL_GPL(snd_soc_link_compr_startup);
-void snd_soc_link_compr_shutdown(struct snd_compr_stream *cstream)
+void snd_soc_link_compr_shutdown(struct snd_compr_stream *cstream,
+ int rollback)
{
struct snd_soc_pcm_runtime *rtd = cstream->private_data;
+ if (rollback && !soc_link_mark_match(rtd, cstream, compr_startup))
+ return;
+
if (rtd->dai_link->compr_ops &&
rtd->dai_link->compr_ops->shutdown)
rtd->dai_link->compr_ops->shutdown(cstream);
+
+ soc_link_mark_pop(rtd, cstream, compr_startup);
}
EXPORT_SYMBOL_GPL(snd_soc_link_compr_shutdown);