41 |
#define DEFAULT_TIMER_LIMIT 2 |
#define DEFAULT_TIMER_LIMIT 2 |
42 |
#endif |
#endif |
43 |
|
|
44 |
int timer_limit = DEFAULT_TIMER_LIMIT; |
static int timer_limit = DEFAULT_TIMER_LIMIT; |
45 |
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Takashi Iwai <tiwai@suse.de>"); |
MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, Takashi Iwai <tiwai@suse.de>"); |
46 |
MODULE_DESCRIPTION("ALSA timer interface"); |
MODULE_DESCRIPTION("ALSA timer interface"); |
47 |
MODULE_LICENSE("GPL"); |
MODULE_LICENSE("GPL"); |
458 |
return -EINVAL; |
return -EINVAL; |
459 |
spin_lock_irqsave(&timer->lock, flags); |
spin_lock_irqsave(&timer->lock, flags); |
460 |
list_del_init(&timeri->ack_list); |
list_del_init(&timeri->ack_list); |
461 |
|
#if 0 /* FIXME: this causes dead lock with the sequencer timer */ |
462 |
/* wait until the callback is finished */ |
/* wait until the callback is finished */ |
463 |
while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { |
while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { |
464 |
spin_unlock_irqrestore(&timer->lock, flags); |
spin_unlock_irqrestore(&timer->lock, flags); |
465 |
udelay(10); |
udelay(10); |
466 |
spin_lock_irqsave(&timer->lock, flags); |
spin_lock_irqsave(&timer->lock, flags); |
467 |
} |
} |
468 |
|
#endif |
469 |
list_del_init(&timeri->active_list); |
list_del_init(&timeri->active_list); |
470 |
if ((timeri->flags & SNDRV_TIMER_IFLG_RUNNING) && |
if ((timeri->flags & SNDRV_TIMER_IFLG_RUNNING) && |
471 |
!(timeri->flags & SNDRV_TIMER_IFLG_SLAVE) && |
!(timeri->flags & SNDRV_TIMER_IFLG_SLAVE) && |
1690 |
break; |
break; |
1691 |
} |
} |
1692 |
} |
} |
|
spin_unlock_irq(&tu->qlock); |
|
1693 |
if (err < 0) |
if (err < 0) |
1694 |
break; |
break; |
1695 |
|
|
1696 |
|
spin_unlock_irq(&tu->qlock); |
1697 |
|
|
1698 |
if (tu->tread) { |
if (tu->tread) { |
1699 |
if (copy_to_user(buffer, &tu->tqueue[tu->qhead++], sizeof(snd_timer_tread_t))) { |
if (copy_to_user(buffer, &tu->tqueue[tu->qhead++], sizeof(snd_timer_tread_t))) { |
1700 |
err = -EFAULT; |
err = -EFAULT; |
1715 |
spin_lock_irq(&tu->qlock); |
spin_lock_irq(&tu->qlock); |
1716 |
tu->qused--; |
tu->qused--; |
1717 |
} |
} |
1718 |
|
spin_unlock_irq(&tu->qlock); |
1719 |
return result > 0 ? result : err; |
return result > 0 ? result : err; |
1720 |
} |
} |
1721 |
|
|
1806 |
module_init(alsa_timer_init) |
module_init(alsa_timer_init) |
1807 |
module_exit(alsa_timer_exit) |
module_exit(alsa_timer_exit) |
1808 |
|
|
1809 |
|
#ifndef MODULE |
1810 |
|
/* format is: snd-timer=timer_limit */ |
1811 |
|
|
1812 |
|
static int __init alsa_timer_setup(char *str) |
1813 |
|
{ |
1814 |
|
(void)(get_option(&str,&timer_limit) == 2); |
1815 |
|
return 1; |
1816 |
|
} |
1817 |
|
|
1818 |
|
__setup("snd-timer=", alsa_timer_setup); |
1819 |
|
#endif /* ifndef MODULE */ |
1820 |
|
|
1821 |
EXPORT_SYMBOL(snd_timer_open); |
EXPORT_SYMBOL(snd_timer_open); |
1822 |
EXPORT_SYMBOL(snd_timer_close); |
EXPORT_SYMBOL(snd_timer_close); |
1823 |
EXPORT_SYMBOL(snd_timer_resolution); |
EXPORT_SYMBOL(snd_timer_resolution); |