diff options
author | Takashi Iwai <tiwai@suse.de> | 2022-01-19 10:10:50 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2022-01-19 17:26:04 +0100 |
commit | 8c0ae778e2874f3742bd619000b791d178c187e2 (patch) | |
tree | 4875aef886334348db34cfcce2e8dcd9509d1408 /sound | |
parent | ALSA: hda: cs35l41: Make cs35l41_hda_remove() return void (diff) | |
download | linux-8c0ae778e2874f3742bd619000b791d178c187e2.tar.xz linux-8c0ae778e2874f3742bd619000b791d178c187e2.zip |
ALSA: core: Simplify snd_power_ref_and_wait() with the standard macro
Use wait_event_cmd() macro and simplify snd_power_ref_wait()
implementation. This may also cover possible races in the current
open code, too.
Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20220119091050.30125-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/init.c | 25 |
1 files changed, 5 insertions, 20 deletions
diff --git a/sound/core/init.c b/sound/core/init.c index ac335f5906c6..31ba7024e3ad 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -1111,29 +1111,14 @@ EXPORT_SYMBOL(snd_card_file_remove); */ int snd_power_ref_and_wait(struct snd_card *card) { - wait_queue_entry_t wait; - int result = 0; - snd_power_ref(card); - /* fastpath */ if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) return 0; - init_waitqueue_entry(&wait, current); - add_wait_queue(&card->power_sleep, &wait); - while (1) { - if (card->shutdown) { - result = -ENODEV; - break; - } - if (snd_power_get_state(card) == SNDRV_CTL_POWER_D0) - break; - snd_power_unref(card); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(30 * HZ); - snd_power_ref(card); - } - remove_wait_queue(&card->power_sleep, &wait); - return result; + wait_event_cmd(card->power_sleep, + card->shutdown || + snd_power_get_state(card) == SNDRV_CTL_POWER_D0, + snd_power_unref(card), snd_power_ref(card)); + return card->shutdown ? -ENODEV : 0; } EXPORT_SYMBOL_GPL(snd_power_ref_and_wait); |