Commit a7588c89 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: timer: Check ack_list emptiness instead of bit flag

For checking the pending timer instance that is still left on the
timer object that is being closed, we set/clear a bit flag
SNDRV_TIMER_IFLG_CALLBACK around the call of callbacks.  This can be
simplified by replace with the list_empty() call for ti->ack_list.
This covers the existence more comprehensively and safely.

A gratis bonus is that we can get rid of SNDRV_TIMER_IFLG_CALLBACK bit
flag definition as well.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 7bb4a8a2
...@@ -43,7 +43,6 @@ ...@@ -43,7 +43,6 @@
#define SNDRV_TIMER_IFLG_START 0x00000004 #define SNDRV_TIMER_IFLG_START 0x00000004
#define SNDRV_TIMER_IFLG_AUTO 0x00000008 /* auto restart */ #define SNDRV_TIMER_IFLG_AUTO 0x00000008 /* auto restart */
#define SNDRV_TIMER_IFLG_FAST 0x00000010 /* fast callback (do not use tasklet) */ #define SNDRV_TIMER_IFLG_FAST 0x00000010 /* fast callback (do not use tasklet) */
#define SNDRV_TIMER_IFLG_CALLBACK 0x00000020 /* timer callback is active */
#define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040 /* exclusive owner - no more instances */ #define SNDRV_TIMER_IFLG_EXCLUSIVE 0x00000040 /* exclusive owner - no more instances */
#define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080 /* write early event to the poll queue */ #define SNDRV_TIMER_IFLG_EARLY_EVENT 0x00000080 /* write early event to the poll queue */
......
...@@ -366,7 +366,7 @@ static int snd_timer_close_locked(struct snd_timer_instance *timeri) ...@@ -366,7 +366,7 @@ static int snd_timer_close_locked(struct snd_timer_instance *timeri)
timer->num_instances--; timer->num_instances--;
/* wait, until the active callback is finished */ /* wait, until the active callback is finished */
spin_lock_irq(&timer->lock); spin_lock_irq(&timer->lock);
while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { while (!list_empty(&timeri->ack_list)) {
spin_unlock_irq(&timer->lock); spin_unlock_irq(&timer->lock);
udelay(10); udelay(10);
spin_lock_irq(&timer->lock); spin_lock_irq(&timer->lock);
...@@ -731,19 +731,17 @@ static void snd_timer_process_callbacks(struct snd_timer *timer, ...@@ -731,19 +731,17 @@ static void snd_timer_process_callbacks(struct snd_timer *timer,
ti = list_first_entry(head, struct snd_timer_instance, ti = list_first_entry(head, struct snd_timer_instance,
ack_list); ack_list);
/* remove from ack_list and make empty */
list_del_init(&ti->ack_list);
ticks = ti->pticks; ticks = ti->pticks;
ti->pticks = 0; ti->pticks = 0;
resolution = ti->resolution; resolution = ti->resolution;
ti->flags |= SNDRV_TIMER_IFLG_CALLBACK;
spin_unlock(&timer->lock); spin_unlock(&timer->lock);
if (ti->callback) if (ti->callback)
ti->callback(ti, resolution, ticks); ti->callback(ti, resolution, ticks);
spin_lock(&timer->lock); spin_lock(&timer->lock);
ti->flags &= ~SNDRV_TIMER_IFLG_CALLBACK;
/* remove from ack_list and make empty */
list_del_init(&ti->ack_list);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment