ALSA: pcm: Allow nonatomic trigger operations
authorTakashi Iwai <tiwai@suse.de>
Fri, 29 Aug 2014 13:32:29 +0000 (15:32 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 3 Sep 2014 12:04:08 +0000 (14:04 +0200)
commit257f8cce5d40b811d229ed71602882baa0012808
tree190a239257c625539a1b157acb3bd0075cdb61dc
parent52addcf9d6669fa439387610bc65c92fa0980cef
ALSA: pcm: Allow nonatomic trigger operations

Currently, many PCM operations are performed in a critical section
protected by spinlock, typically the trigger and pointer callbacks are
assumed to be atomic.  This is basically because some trigger action
(e.g. PCM stop after drain or xrun) is done in the interrupt handler.
If a driver runs in a threaded irq, however, this doesn't have to be
atomic.  And many devices want to handle trigger in a non-atomic
context due to lengthy communications.

This patch tries all PCM calls operational in non-atomic context.
What it does is very simple: replaces the substream spinlock with the
corresponding substream mutex when pcm->nonatomic flag is set.  The
driver that wants to use the non-atomic PCM ops just needs to set the
flag and keep the rest as is.  (Of course, it must not handle any PCM
ops in irq context.)

Note that the code doesn't check whether it's atomic-safe or not, but
trust in 100% that the driver sets pcm->nonatomic correctly.

One possible problem is the case where linked PCM substreams have
inconsistent nonatomic states.  For avoiding this, snd_pcm_link()
returns an error if one tries to link an inconsistent PCM substream.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/pcm.h
sound/core/pcm.c
sound/core/pcm_native.c