#define SNDRV_TIMER_IFLG_START   0x00000004
 #define SNDRV_TIMER_IFLG_AUTO    0x00000008    /* auto restart */
 #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_EARLY_EVENT 0x00000080        /* write early event to the poll queue */
 
 
                timer->num_instances--;
                /* wait, until the active callback is finished */
                spin_lock_irq(&timer->lock);
-               while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) {
+               while (!list_empty(&timeri->ack_list)) {
                        spin_unlock_irq(&timer->lock);
                        udelay(10);
                        spin_lock_irq(&timer->lock);
                ti = list_first_entry(head, struct snd_timer_instance,
                                      ack_list);
 
-               /* remove from ack_list and make empty */
-               list_del_init(&ti->ack_list);
-
                ticks = ti->pticks;
                ti->pticks = 0;
                resolution = ti->resolution;
 
-               ti->flags |= SNDRV_TIMER_IFLG_CALLBACK;
                spin_unlock(&timer->lock);
                if (ti->callback)
                        ti->callback(ti, resolution, ticks);
                spin_lock(&timer->lock);
-               ti->flags &= ~SNDRV_TIMER_IFLG_CALLBACK;
+
+               /* remove from ack_list and make empty */
+               list_del_init(&ti->ack_list);
        }
 }