summaryrefslogtreecommitdiffstats
path: root/sound/firewire/oxfw/oxfw-pcm.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/firewire/oxfw/oxfw-pcm.c')
-rw-r--r--sound/firewire/oxfw/oxfw-pcm.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sound/firewire/oxfw/oxfw-pcm.c b/sound/firewire/oxfw/oxfw-pcm.c
index e84fc9c4bfd1..9bc556b15a92 100644
--- a/sound/firewire/oxfw/oxfw-pcm.c
+++ b/sound/firewire/oxfw/oxfw-pcm.c
@@ -192,10 +192,14 @@ static int pcm_open(struct snd_pcm_substream *substream)
struct snd_oxfw *oxfw = substream->private_data;
int err;
- err = init_hw_params(oxfw, substream);
+ err = snd_oxfw_stream_lock_try(oxfw);
if (err < 0)
goto end;
+ err = init_hw_params(oxfw, substream);
+ if (err < 0)
+ goto err_locked;
+
/*
* When any PCM streams are already running, the available sampling
* rate is limited at current value.
@@ -210,10 +214,16 @@ static int pcm_open(struct snd_pcm_substream *substream)
snd_pcm_set_sync(substream);
end:
return err;
+err_locked:
+ snd_oxfw_stream_lock_release(oxfw);
+ return err;
}
static int pcm_close(struct snd_pcm_substream *substream)
{
+ struct snd_oxfw *oxfw = substream->private_data;
+
+ snd_oxfw_stream_lock_release(oxfw);
return 0;
}