/* list of open master instances that can accept slave links */
static LIST_HEAD(snd_timer_master_list);
-/* lock for slave active lists */
-static DEFINE_SPINLOCK(slave_active_lock);
+/* rwlock for timer instance (for trigger actions) */
+static DEFINE_RWLOCK(timeri_lock);
#define MAX_SLAVE_INSTANCES 1000
static int num_slaves;
{
struct snd_timer *t;
- guard(spinlock_irqsave)(&slave_active_lock);
+ guard(read_lock_irqsave)(&timeri_lock);
t = timeri->timer;
if (!t)
return NULL;
list_move_tail(&slave->open_list, &master->slave_list_head);
master->timer->num_instances++;
snd_timer_ref_get(master->timer);
- guard(spinlock_irq)(&slave_active_lock);
+ guard(write_lock_irq)(&timeri_lock);
guard(spinlock)(&master->timer->lock);
slave->master = master;
slave->timer = master->timer;
{
struct snd_timer_instance *slave, *tmp;
- guard(spinlock_irq)(&slave_active_lock);
+ guard(write_lock_irq)(&timeri_lock);
guard(spinlock)(&timer->lock);
timeri->timer = NULL;
list_for_each_entry_safe(slave, tmp, &timeri->slave_list_head, open_list) {
if (!timer)
return -EINVAL;
- guard(spinlock_irqsave)(&timer->lock);
+ guard(spinlock)(&timer->lock);
if (timeri->flags & SNDRV_TIMER_IFLG_DEAD)
return -EINVAL;
if (timer->card && timer->card->shutdown)
static int snd_timer_start_slave(struct snd_timer_instance *timeri,
bool start)
{
- guard(spinlock_irqsave)(&slave_active_lock);
if (timeri->flags & SNDRV_TIMER_IFLG_DEAD)
return -EINVAL;
if (timeri->flags & SNDRV_TIMER_IFLG_RUNNING)
timer = timeri->timer;
if (!timer)
return -EINVAL;
- guard(spinlock_irqsave)(&timer->lock);
+ guard(spinlock)(&timer->lock);
list_del_init(&timeri->ack_list);
list_del_init(&timeri->active_list);
if (!(timeri->flags & (SNDRV_TIMER_IFLG_RUNNING |
{
bool running;
- guard(spinlock_irqsave)(&slave_active_lock);
running = timeri->flags & SNDRV_TIMER_IFLG_RUNNING;
timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING;
if (timeri->timer) {
{
if (timeri == NULL || ticks < 1)
return -EINVAL;
+ guard(read_lock_irqsave)(&timeri_lock);
if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE)
return snd_timer_start_slave(timeri, true);
else
*/
int snd_timer_stop(struct snd_timer_instance *timeri)
{
+ guard(read_lock_irqsave)(&timeri_lock);
if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE)
return snd_timer_stop_slave(timeri, true);
else
if (!(timeri->flags & SNDRV_TIMER_IFLG_PAUSED))
return -EINVAL;
+ guard(read_lock_irqsave)(&timeri_lock);
if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE)
return snd_timer_start_slave(timeri, false);
else
*/
int snd_timer_pause(struct snd_timer_instance * timeri)
{
+ guard(read_lock_irqsave)(&timeri_lock);
if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE)
return snd_timer_stop_slave(timeri, false);
else