aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/core/init.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/sound/core/init.c b/sound/core/init.c
index 07acac77ea45..ac0573416130 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -311,6 +311,9 @@ int snd_card_disconnect(struct snd_card *card)
311 struct file *file; 311 struct file *file;
312 int err; 312 int err;
313 313
314 if (!card)
315 return -EINVAL;
316
314 spin_lock(&card->files_lock); 317 spin_lock(&card->files_lock);
315 if (card->shutdown) { 318 if (card->shutdown) {
316 spin_unlock(&card->files_lock); 319 spin_unlock(&card->files_lock);
@@ -322,6 +325,7 @@ int snd_card_disconnect(struct snd_card *card)
322 /* phase 1: disable fops (user space) operations for ALSA API */ 325 /* phase 1: disable fops (user space) operations for ALSA API */
323 mutex_lock(&snd_card_mutex); 326 mutex_lock(&snd_card_mutex);
324 snd_cards[card->number] = NULL; 327 snd_cards[card->number] = NULL;
328 snd_cards_lock &= ~(1 << card->number);
325 mutex_unlock(&snd_card_mutex); 329 mutex_unlock(&snd_card_mutex);
326 330
327 /* phase 2: replace file->f_op with special dummy operations */ 331 /* phase 2: replace file->f_op with special dummy operations */
@@ -366,6 +370,9 @@ int snd_card_disconnect(struct snd_card *card)
366 card->card_dev = NULL; 370 card->card_dev = NULL;
367 } 371 }
368#endif 372#endif
373#ifdef CONFIG_PM
374 wake_up(&card->power_sleep);
375#endif
369 return 0; 376 return 0;
370} 377}
371 378
@@ -411,25 +418,10 @@ static int snd_card_do_free(struct snd_card *card)
411 return 0; 418 return 0;
412} 419}
413 420
414static int snd_card_free_prepare(struct snd_card *card)
415{
416 if (card == NULL)
417 return -EINVAL;
418 (void) snd_card_disconnect(card);
419 mutex_lock(&snd_card_mutex);
420 snd_cards[card->number] = NULL;
421 snd_cards_lock &= ~(1 << card->number);
422 mutex_unlock(&snd_card_mutex);
423#ifdef CONFIG_PM
424 wake_up(&card->power_sleep);
425#endif
426 return 0;
427}
428
429int snd_card_free_when_closed(struct snd_card *card) 421int snd_card_free_when_closed(struct snd_card *card)
430{ 422{
431 int free_now = 0; 423 int free_now = 0;
432 int ret = snd_card_free_prepare(card); 424 int ret = snd_card_disconnect(card);
433 if (ret) 425 if (ret)
434 return ret; 426 return ret;
435 427
@@ -449,7 +441,7 @@ EXPORT_SYMBOL(snd_card_free_when_closed);
449 441
450int snd_card_free(struct snd_card *card) 442int snd_card_free(struct snd_card *card)
451{ 443{
452 int ret = snd_card_free_prepare(card); 444 int ret = snd_card_disconnect(card);
453 if (ret) 445 if (ret)
454 return ret; 446 return ret;
455 447