diff options
Diffstat (limited to 'sound/usb/pcm.c')
| -rw-r--r-- | sound/usb/pcm.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 4132522ac90f..e3f680526cb5 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c | |||
| @@ -361,6 +361,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, | |||
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | if (changed) { | 363 | if (changed) { |
| 364 | mutex_lock(&subs->stream->chip->shutdown_mutex); | ||
| 364 | /* format changed */ | 365 | /* format changed */ |
| 365 | snd_usb_release_substream_urbs(subs, 0); | 366 | snd_usb_release_substream_urbs(subs, 0); |
| 366 | /* influenced: period_bytes, channels, rate, format, */ | 367 | /* influenced: period_bytes, channels, rate, format, */ |
| @@ -368,6 +369,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, | |||
| 368 | params_rate(hw_params), | 369 | params_rate(hw_params), |
| 369 | snd_pcm_format_physical_width(params_format(hw_params)) * | 370 | snd_pcm_format_physical_width(params_format(hw_params)) * |
| 370 | params_channels(hw_params)); | 371 | params_channels(hw_params)); |
| 372 | mutex_unlock(&subs->stream->chip->shutdown_mutex); | ||
| 371 | } | 373 | } |
| 372 | 374 | ||
| 373 | return ret; | 375 | return ret; |
| @@ -385,8 +387,9 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream) | |||
| 385 | subs->cur_audiofmt = NULL; | 387 | subs->cur_audiofmt = NULL; |
| 386 | subs->cur_rate = 0; | 388 | subs->cur_rate = 0; |
| 387 | subs->period_bytes = 0; | 389 | subs->period_bytes = 0; |
| 388 | if (!subs->stream->chip->shutdown) | 390 | mutex_lock(&subs->stream->chip->shutdown_mutex); |
| 389 | snd_usb_release_substream_urbs(subs, 0); | 391 | snd_usb_release_substream_urbs(subs, 0); |
| 392 | mutex_unlock(&subs->stream->chip->shutdown_mutex); | ||
| 390 | return snd_pcm_lib_free_vmalloc_buffer(substream); | 393 | return snd_pcm_lib_free_vmalloc_buffer(substream); |
| 391 | } | 394 | } |
| 392 | 395 | ||
