diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2019-08-13 13:45:32 +0300 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2019-08-15 15:07:43 +0100 |
commit | 72b745e3ad65deac94ea4eb83262c52ba3ffdb5b (patch) | |
tree | a5850d63c1e97e8fc8d4a6e1f29b8d6e181b112a /include/sound | |
parent | 12f0bfadf69bb154052722e7e4e5cd1639044c76 (diff) | |
download | linux-stable-72b745e3ad65deac94ea4eb83262c52ba3ffdb5b.tar.gz linux-stable-72b745e3ad65deac94ea4eb83262c52ba3ffdb5b.tar.bz2 linux-stable-72b745e3ad65deac94ea4eb83262c52ba3ffdb5b.zip |
ASoC: core: Move pcm_mutex up to card level from snd_soc_pcm_runtime
The pcm_mutex is used to prevent concurrent execution of snd_pcm_ops
callbacks. This works fine most of the cases but it can not handle setups
when the same DAI is used by different rtd, for example:
pcm3168a have two DAIs: one for Playback and one for Capture.
If the codec is connected to a single CPU DAI we need to have two dai_link
to support both playback and capture.
In this case the snd_pcm_ops callbacks can be executed in parallel causing
unexpected races in DAI drivers.
By moving the pcm_mutex up to card level this can be solved
while - hopefully - not breaking other setups.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Tested-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20190813104532.16669-1-peter.ujfalusi@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'include/sound')
-rw-r--r-- | include/sound/soc.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index b1fe5ebea257..5c841c2ee814 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -988,6 +988,10 @@ struct snd_soc_card { struct mutex mutex; struct mutex dapm_mutex; + /* Mutex for PCM operations */ + struct mutex pcm_mutex; + enum snd_soc_pcm_subclass pcm_subclass; + spinlock_t dpcm_lock; bool instantiated; @@ -1116,8 +1120,6 @@ struct snd_soc_pcm_runtime { struct device *dev; struct snd_soc_card *card; struct snd_soc_dai_link *dai_link; - struct mutex pcm_mutex; - enum snd_soc_pcm_subclass pcm_subclass; struct snd_pcm_ops ops; unsigned int params_select; /* currently selected param for dai link */ |