diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/init.c | 26 |
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 | ||
414 | static 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 | |||
429 | int snd_card_free_when_closed(struct snd_card *card) | 421 | int 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 | ||
450 | int snd_card_free(struct snd_card *card) | 442 | int 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 | ||