[alsa-devel] [PATCH 0/2][RESEND] ASoC: add/use snd_soc_disconnect_sync()
Hi Mark
These are resend of add/use snd_soc_disconnect_sync() which is based on ALSA snd_card_disconnect_sync(). snd_card_disconnect_sync() was added Takashi-san's sound-4.15-rc1 branch. (or topic/card-disconnect branch)
Without these patches, at least Renesas sound driver will hung up if user disconnect driver during playback.
Kuninori Morimoto (2): ASoC: add snd_soc_disconnect_sync() ASoC: rsnd: call snd_soc_disconnect_sync() when remove
include/sound/soc.h | 2 ++ sound/soc/sh/rcar/core.c | 2 ++ sound/soc/soc-core.c | 10 ++++++++++ 3 files changed, 14 insertions(+)
From: Kuninori Morimoto kuninori.morimoto.gx@renesas.com
Now, we have snd_card_disconnect_sync() on ALSA framework. snd_soc_disconnect_sync() is ASoC version of it.
Signed-off-by: Kuninori Morimoto kuninori.morimoto.gx@renesas.com --- include/sound/soc.h | 2 ++ sound/soc/soc-core.c | 10 ++++++++++ 2 files changed, 12 insertions(+)
diff --git a/include/sound/soc.h b/include/sound/soc.h index 546c89ac..3ff7e9d 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -464,6 +464,8 @@ struct snd_soc_component *snd_soc_lookup_component(struct device *dev, int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num); #endif
+void snd_soc_disconnect_sync(struct device *dev); + struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, const char *dai_link, int stream); struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card, diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index d3eedff..ab89f1c 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1136,6 +1136,16 @@ static int soc_init_dai_link(struct snd_soc_card *card, return 0; }
+void snd_soc_disconnect_sync(struct device *dev) +{ + struct snd_soc_component *component = snd_soc_lookup_component(dev, NULL); + + if (!component || !component->card) + return; + + snd_card_disconnect_sync(component->card->snd_card); +} + /** * snd_soc_add_dai_link - Add a DAI link dynamically * @card: The ASoC card to which the DAI link is added
From: Kuninori Morimoto kuninori.morimoto.gx@renesas.com
Renesas R-Car sound driver should be stopped if unbinded during playbacking/capturing. Otherwise clock open/close counter mismatch happen.
One note is that we can't skip from remove function (= return -Exxx) in such case if user used unbind. Because unbind function doesn't check return value from each driver's remove function. This means we must to stop and remove driver in remove function.
Now ASoC has snd_soc_disconnect_sync() for this purpose. Let's use it.
Signed-off-by: Kuninori Morimoto kuninori.morimoto.gx@renesas.com --- sound/soc/sh/rcar/core.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index 16a913c..a40f6a0 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c @@ -1485,6 +1485,8 @@ static int rsnd_remove(struct platform_device *pdev) }; int ret = 0, i;
+ snd_soc_disconnect_sync(&pdev->dev); + pm_runtime_disable(&pdev->dev);
for_each_rsnd_dai(rdai, priv, i) {
participants (1)
-
Kuninori Morimoto