#include <linux/smp_lock.h>
#include <linux/slab.h>
#include <linux/time.h>
-#include <linux/mutex.h>
#include <linux/moduleparam.h>
#include <linux/string.h>
#include <sound/core.h>
struct timespec tstamp; /* trigger tstamp */
wait_queue_head_t qchange_sleep;
struct fasync_struct *fasync;
- struct mutex tread_sem;
+ struct semaphore tread_sem;
};
/* list of timers */
/* lock for slave active lists */
static DEFINE_SPINLOCK(slave_active_lock);
-static DEFINE_MUTEX(register_mutex);
+static DECLARE_MUTEX(register_mutex);
static int snd_timer_free(struct snd_timer *timer);
static int snd_timer_dev_free(struct snd_device *device);
snd_printd("invalid slave class %i\n", tid->dev_sclass);
return -EINVAL;
}
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
timeri = snd_timer_instance_new(owner, NULL);
if (!timeri) {
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return -ENOMEM;
}
timeri->slave_class = tid->dev_sclass;
timeri->flags |= SNDRV_TIMER_IFLG_SLAVE;
list_add_tail(&timeri->open_list, &snd_timer_slave_list);
snd_timer_check_slave(timeri);
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
*ti = timeri;
return 0;
}
/* open a master instance */
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
timer = snd_timer_find(tid);
#ifdef CONFIG_KMOD
if (timer == NULL) {
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
snd_timer_request(tid);
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
timer = snd_timer_find(tid);
}
#endif
if (!timer) {
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return -ENODEV;
}
if (!list_empty(&timer->open_list_head)) {
timeri = list_entry(timer->open_list_head.next,
struct snd_timer_instance, open_list);
if (timeri->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) {
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return -EBUSY;
}
}
timeri = snd_timer_instance_new(owner, timer);
if (!timeri) {
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return -ENOMEM;
}
timeri->slave_class = tid->dev_sclass;
timer->hw.open(timer);
list_add_tail(&timeri->open_list, &timer->open_list_head);
snd_timer_check_master(timeri);
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
*ti = timeri;
return 0;
}
spin_lock_irq(&slave_active_lock);
}
spin_unlock_irq(&slave_active_lock);
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
list_del(&timeri->open_list);
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
} else {
timer = timeri->timer;
/* wait, until the active callback is finished */
spin_lock_irq(&timer->lock);
}
spin_unlock_irq(&timer->lock);
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
list_del(&timeri->open_list);
if (timer && list_empty(&timer->open_list_head) &&
timer->hw.close)
slave->timer = NULL;
spin_unlock_irq(&slave_active_lock);
}
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
}
if (timeri->private_free)
timeri->private_free(timeri);
struct snd_timer_instance *ti;
struct list_head *p;
unsigned long resolution, ticks;
+ unsigned long flags;
- spin_lock(&timer->lock);
+ spin_lock_irqsave(&timer->lock, flags);
/* now process all callbacks */
while (!list_empty(&timer->sack_list_head)) {
p = timer->sack_list_head.next; /* get first item */
spin_lock(&timer->lock);
ti->flags &= ~SNDRV_TIMER_IFLG_CALLBACK;
}
- spin_unlock(&timer->lock);
+ spin_unlock_irqrestore(&timer->lock, flags);
}
/*
!timer->hw.resolution && timer->hw.c_resolution == NULL)
return -EINVAL;
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
list_for_each(p, &snd_timer_list) {
timer1 = list_entry(p, struct snd_timer, device_list);
if (timer1->tmr_class > timer->tmr_class)
if (timer1->tmr_subdevice < timer->tmr_subdevice)
continue;
/* conflicts.. */
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return -EBUSY;
}
list_add_tail(&timer->device_list, p);
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return 0;
}
struct snd_timer_instance *ti;
snd_assert(timer != NULL, return -ENXIO);
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
if (! list_empty(&timer->open_list_head)) {
snd_printk(KERN_WARNING "timer 0x%lx is busy?\n", (long)timer);
list_for_each_safe(p, n, &timer->open_list_head) {
}
}
list_del(&timer->device_list);
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return snd_timer_free(timer);
}
struct snd_timer_instance *ti;
struct list_head *p, *q;
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
list_for_each(p, &snd_timer_list) {
timer = list_entry(p, struct snd_timer, device_list);
switch (timer->tmr_class) {
}
spin_unlock_irqrestore(&timer->lock, flags);
}
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
}
static struct snd_info_entry *snd_timer_proc_entry = NULL;
return -ENOMEM;
spin_lock_init(&tu->qlock);
init_waitqueue_head(&tu->qchange_sleep);
- mutex_init(&tu->tread_sem);
+ init_MUTEX(&tu->tread_sem);
tu->ticks = 1;
tu->queue_size = 128;
tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read),
if (copy_from_user(&id, _tid, sizeof(id)))
return -EFAULT;
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
if (id.dev_class < 0) { /* first item */
if (list_empty(&snd_timer_list))
snd_timer_user_zero_id(&id);
snd_timer_user_zero_id(&id);
}
}
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
if (copy_to_user(_tid, &id, sizeof(*_tid)))
return -EFAULT;
return 0;
tid = ginfo->tid;
memset(ginfo, 0, sizeof(*ginfo));
ginfo->tid = tid;
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
t = snd_timer_find(&tid);
if (t != NULL) {
ginfo->card = t->card ? t->card->number : -1;
} else {
err = -ENODEV;
}
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
if (err >= 0 && copy_to_user(_ginfo, ginfo, sizeof(*ginfo)))
err = -EFAULT;
kfree(ginfo);
if (copy_from_user(&gparams, _gparams, sizeof(gparams)))
return -EFAULT;
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
t = snd_timer_find(&gparams.tid);
if (!t) {
err = -ENODEV;
}
err = t->hw.set_period(t, gparams.period_num, gparams.period_den);
_error:
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
return err;
}
tid = gstatus.tid;
memset(&gstatus, 0, sizeof(gstatus));
gstatus.tid = tid;
- mutex_lock(®ister_mutex);
+ down(®ister_mutex);
t = snd_timer_find(&tid);
if (t != NULL) {
if (t->hw.c_resolution)
} else {
err = -ENODEV;
}
- mutex_unlock(®ister_mutex);
+ up(®ister_mutex);
if (err >= 0 && copy_to_user(_gstatus, &gstatus, sizeof(gstatus)))
err = -EFAULT;
return err;
int err = 0;
tu = file->private_data;
- mutex_lock(&tu->tread_sem);
+ down(&tu->tread_sem);
if (tu->timeri) {
snd_timer_close(tu->timeri);
tu->timeri = NULL;
}
__err:
- mutex_unlock(&tu->tread_sem);
+ up(&tu->tread_sem);
return err;
}
{
int xarg;
- mutex_lock(&tu->tread_sem);
+ down(&tu->tread_sem);
if (tu->timeri) { /* too late */
- mutex_unlock(&tu->tread_sem);
+ up(&tu->tread_sem);
return -EBUSY;
}
if (get_user(xarg, p)) {
- mutex_unlock(&tu->tread_sem);
+ up(&tu->tread_sem);
return -EFAULT;
}
tu->tread = xarg ? 1 : 0;
- mutex_unlock(&tu->tread_sem);
+ up(&tu->tread_sem);
return 0;
}
case SNDRV_TIMER_IOCTL_GINFO: