Lines Matching refs:timer

93 static int snd_timer_free(struct snd_timer *timer);
98 static void snd_timer_reschedule(struct snd_timer * timer, unsigned long ticks_left);
105 struct snd_timer *timer) in snd_timer_instance_new() argument
122 timeri->timer = timer; in snd_timer_instance_new()
123 if (timer && !try_module_get(timer->module)) { in snd_timer_instance_new()
137 struct snd_timer *timer = NULL; in snd_timer_find() local
139 list_for_each_entry(timer, &snd_timer_list, device_list) { in snd_timer_find()
140 if (timer->tmr_class != tid->dev_class) in snd_timer_find()
142 if ((timer->tmr_class == SNDRV_TIMER_CLASS_CARD || in snd_timer_find()
143 timer->tmr_class == SNDRV_TIMER_CLASS_PCM) && in snd_timer_find()
144 (timer->card == NULL || in snd_timer_find()
145 timer->card->number != tid->card)) in snd_timer_find()
147 if (timer->tmr_device != tid->device) in snd_timer_find()
149 if (timer->tmr_subdevice != tid->subdevice) in snd_timer_find()
151 return timer; in snd_timer_find()
185 struct snd_timer *timer; in snd_timer_check_slave() local
189 list_for_each_entry(timer, &snd_timer_list, device_list) { in snd_timer_check_slave()
190 list_for_each_entry(master, &timer->open_list_head, open_list) { in snd_timer_check_slave()
193 if (master->timer->num_instances >= in snd_timer_check_slave()
194 master->timer->max_instances) in snd_timer_check_slave()
198 master->timer->num_instances++; in snd_timer_check_slave()
201 slave->timer = master->timer; in snd_timer_check_slave()
224 if (master->timer->num_instances >= in snd_timer_check_master()
225 master->timer->max_instances) in snd_timer_check_master()
228 master->timer->num_instances++; in snd_timer_check_master()
230 spin_lock(&master->timer->lock); in snd_timer_check_master()
232 slave->timer = master->timer; in snd_timer_check_master()
236 spin_unlock(&master->timer->lock); in snd_timer_check_master()
253 struct snd_timer *timer; in snd_timer_open() local
287 timer = snd_timer_find(tid); in snd_timer_open()
289 if (!timer) { in snd_timer_open()
293 timer = snd_timer_find(tid); in snd_timer_open()
296 if (!timer) { in snd_timer_open()
300 if (!list_empty(&timer->open_list_head)) { in snd_timer_open()
301 timeri = list_entry(timer->open_list_head.next, in snd_timer_open()
308 if (timer->num_instances >= timer->max_instances) { in snd_timer_open()
312 timeri = snd_timer_instance_new(owner, timer); in snd_timer_open()
318 if (timer->card) in snd_timer_open()
319 get_device(&timer->card->card_dev); in snd_timer_open()
323 if (list_empty(&timer->open_list_head) && timer->hw.open) { in snd_timer_open()
324 int err = timer->hw.open(timer); in snd_timer_open()
329 if (timer->card) in snd_timer_open()
330 put_device(&timer->card->card_dev); in snd_timer_open()
331 module_put(timer->module); in snd_timer_open()
337 list_add_tail(&timeri->open_list, &timer->open_list_head); in snd_timer_open()
338 timer->num_instances++; in snd_timer_open()
356 struct snd_timer *timer = NULL; in snd_timer_close_locked() local
364 timer = timeri->timer; in snd_timer_close_locked()
365 if (timer) { in snd_timer_close_locked()
366 timer->num_instances--; in snd_timer_close_locked()
368 spin_lock_irq(&timer->lock); in snd_timer_close_locked()
370 spin_unlock_irq(&timer->lock); in snd_timer_close_locked()
372 spin_lock_irq(&timer->lock); in snd_timer_close_locked()
374 spin_unlock_irq(&timer->lock); in snd_timer_close_locked()
378 spin_lock(&timer->lock); in snd_timer_close_locked()
382 timer->num_instances--; in snd_timer_close_locked()
384 slave->timer = NULL; in snd_timer_close_locked()
388 spin_unlock(&timer->lock); in snd_timer_close_locked()
393 timer = NULL; in snd_timer_close_locked()
401 if (timer) { in snd_timer_close_locked()
402 if (list_empty(&timer->open_list_head) && timer->hw.close) in snd_timer_close_locked()
403 timer->hw.close(timer); in snd_timer_close_locked()
405 if (timer->card) in snd_timer_close_locked()
406 put_device(&timer->card->card_dev); in snd_timer_close_locked()
407 module_put(timer->module); in snd_timer_close_locked()
430 static unsigned long snd_timer_hw_resolution(struct snd_timer *timer) in snd_timer_hw_resolution() argument
432 if (timer->hw.c_resolution) in snd_timer_hw_resolution()
433 return timer->hw.c_resolution(timer); in snd_timer_hw_resolution()
435 return timer->hw.resolution; in snd_timer_hw_resolution()
440 struct snd_timer * timer; in snd_timer_resolution() local
446 timer = timeri->timer; in snd_timer_resolution()
447 if (timer) { in snd_timer_resolution()
448 spin_lock_irqsave(&timer->lock, flags); in snd_timer_resolution()
449 ret = snd_timer_hw_resolution(timer); in snd_timer_resolution()
450 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_resolution()
458 struct snd_timer *timer = ti->timer; in snd_timer_notify1() local
470 if (timer && in snd_timer_notify1()
473 resolution = snd_timer_hw_resolution(timer); in snd_timer_notify1()
478 if (timer == NULL) in snd_timer_notify1()
480 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) in snd_timer_notify1()
491 struct snd_timer *timer; in snd_timer_start1() local
495 timer = timeri->timer; in snd_timer_start1()
496 if (!timer) in snd_timer_start1()
499 spin_lock_irqsave(&timer->lock, flags); in snd_timer_start1()
500 if (timer->card && timer->card->shutdown) { in snd_timer_start1()
516 list_move_tail(&timeri->active_list, &timer->active_list_head); in snd_timer_start1()
517 if (timer->running) { in snd_timer_start1()
518 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) in snd_timer_start1()
520 timer->flags |= SNDRV_TIMER_FLG_RESCHED; in snd_timer_start1()
525 timer->sticks = ticks; in snd_timer_start1()
526 timer->hw.start(timer); in snd_timer_start1()
528 timer->running++; in snd_timer_start1()
535 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_start1()
551 if (timeri->master && timeri->timer) { in snd_timer_start_slave()
552 spin_lock(&timeri->timer->lock); in snd_timer_start_slave()
557 spin_unlock(&timeri->timer->lock); in snd_timer_start_slave()
566 struct snd_timer *timer; in snd_timer_stop1() local
570 timer = timeri->timer; in snd_timer_stop1()
571 if (!timer) in snd_timer_stop1()
573 spin_lock_irqsave(&timer->lock, flags); in snd_timer_stop1()
581 if (timer->card && timer->card->shutdown) in snd_timer_stop1()
588 !(--timer->running)) { in snd_timer_stop1()
589 timer->hw.stop(timer); in snd_timer_stop1()
590 if (timer->flags & SNDRV_TIMER_FLG_RESCHED) { in snd_timer_stop1()
591 timer->flags &= ~SNDRV_TIMER_FLG_RESCHED; in snd_timer_stop1()
592 snd_timer_reschedule(timer, 0); in snd_timer_stop1()
593 if (timer->flags & SNDRV_TIMER_FLG_CHANGE) { in snd_timer_stop1()
594 timer->flags &= ~SNDRV_TIMER_FLG_CHANGE; in snd_timer_stop1()
595 timer->hw.start(timer); in snd_timer_stop1()
607 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_stop1()
622 if (timeri->timer) { in snd_timer_stop_slave()
623 spin_lock(&timeri->timer->lock); in snd_timer_stop_slave()
628 spin_unlock(&timeri->timer->lock); in snd_timer_stop_slave()
696 static void snd_timer_reschedule(struct snd_timer * timer, unsigned long ticks_left) in snd_timer_reschedule() argument
701 list_for_each_entry(ti, &timer->active_list_head, active_list) { in snd_timer_reschedule()
705 timer->running++; in snd_timer_reschedule()
713 timer->flags &= ~SNDRV_TIMER_FLG_RESCHED; in snd_timer_reschedule()
716 if (ticks > timer->hw.ticks) in snd_timer_reschedule()
717 ticks = timer->hw.ticks; in snd_timer_reschedule()
719 timer->flags |= SNDRV_TIMER_FLG_CHANGE; in snd_timer_reschedule()
720 timer->sticks = ticks; in snd_timer_reschedule()
729 struct snd_timer *timer = (struct snd_timer *) arg; in snd_timer_tasklet() local
735 if (timer->card && timer->card->shutdown) in snd_timer_tasklet()
738 spin_lock_irqsave(&timer->lock, flags); in snd_timer_tasklet()
740 while (!list_empty(&timer->sack_list_head)) { in snd_timer_tasklet()
741 p = timer->sack_list_head.next; /* get first item */ in snd_timer_tasklet()
752 spin_unlock(&timer->lock); in snd_timer_tasklet()
755 spin_lock(&timer->lock); in snd_timer_tasklet()
758 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_tasklet()
767 void snd_timer_interrupt(struct snd_timer * timer, unsigned long ticks_left) in snd_timer_interrupt() argument
775 if (timer == NULL) in snd_timer_interrupt()
778 if (timer->card && timer->card->shutdown) in snd_timer_interrupt()
781 spin_lock_irqsave(&timer->lock, flags); in snd_timer_interrupt()
784 resolution = snd_timer_hw_resolution(timer); in snd_timer_interrupt()
791 list_for_each_entry_safe(ti, tmp, &timer->active_list_head, in snd_timer_interrupt()
807 --timer->running; in snd_timer_interrupt()
810 if ((timer->hw.flags & SNDRV_TIMER_HW_TASKLET) || in snd_timer_interrupt()
812 ack_list_head = &timer->ack_list_head; in snd_timer_interrupt()
814 ack_list_head = &timer->sack_list_head; in snd_timer_interrupt()
824 if (timer->flags & SNDRV_TIMER_FLG_RESCHED) in snd_timer_interrupt()
825 snd_timer_reschedule(timer, timer->sticks); in snd_timer_interrupt()
826 if (timer->running) { in snd_timer_interrupt()
827 if (timer->hw.flags & SNDRV_TIMER_HW_STOP) { in snd_timer_interrupt()
828 timer->hw.stop(timer); in snd_timer_interrupt()
829 timer->flags |= SNDRV_TIMER_FLG_CHANGE; in snd_timer_interrupt()
831 if (!(timer->hw.flags & SNDRV_TIMER_HW_AUTO) || in snd_timer_interrupt()
832 (timer->flags & SNDRV_TIMER_FLG_CHANGE)) { in snd_timer_interrupt()
834 timer->flags &= ~SNDRV_TIMER_FLG_CHANGE; in snd_timer_interrupt()
835 timer->hw.start(timer); in snd_timer_interrupt()
838 timer->hw.stop(timer); in snd_timer_interrupt()
842 while (!list_empty(&timer->ack_list_head)) { in snd_timer_interrupt()
843 p = timer->ack_list_head.next; /* get first item */ in snd_timer_interrupt()
853 spin_unlock(&timer->lock); in snd_timer_interrupt()
856 spin_lock(&timer->lock); in snd_timer_interrupt()
861 use_tasklet = !list_empty(&timer->sack_list_head); in snd_timer_interrupt()
862 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_interrupt()
865 tasklet_schedule(&timer->task_queue); in snd_timer_interrupt()
876 struct snd_timer *timer; in snd_timer_new() local
893 timer = kzalloc(sizeof(*timer), GFP_KERNEL); in snd_timer_new()
894 if (!timer) in snd_timer_new()
896 timer->tmr_class = tid->dev_class; in snd_timer_new()
897 timer->card = card; in snd_timer_new()
898 timer->tmr_device = tid->device; in snd_timer_new()
899 timer->tmr_subdevice = tid->subdevice; in snd_timer_new()
901 strlcpy(timer->id, id, sizeof(timer->id)); in snd_timer_new()
902 timer->sticks = 1; in snd_timer_new()
903 INIT_LIST_HEAD(&timer->device_list); in snd_timer_new()
904 INIT_LIST_HEAD(&timer->open_list_head); in snd_timer_new()
905 INIT_LIST_HEAD(&timer->active_list_head); in snd_timer_new()
906 INIT_LIST_HEAD(&timer->ack_list_head); in snd_timer_new()
907 INIT_LIST_HEAD(&timer->sack_list_head); in snd_timer_new()
908 spin_lock_init(&timer->lock); in snd_timer_new()
909 tasklet_init(&timer->task_queue, snd_timer_tasklet, in snd_timer_new()
910 (unsigned long)timer); in snd_timer_new()
911 timer->max_instances = 1000; /* default limit per timer */ in snd_timer_new()
913 timer->module = card->module; in snd_timer_new()
914 err = snd_device_new(card, SNDRV_DEV_TIMER, timer, &ops); in snd_timer_new()
916 snd_timer_free(timer); in snd_timer_new()
921 *rtimer = timer; in snd_timer_new()
926 static int snd_timer_free(struct snd_timer *timer) in snd_timer_free() argument
928 if (!timer) in snd_timer_free()
932 if (! list_empty(&timer->open_list_head)) { in snd_timer_free()
935 pr_warn("ALSA: timer %p is busy?\n", timer); in snd_timer_free()
936 list_for_each_safe(p, n, &timer->open_list_head) { in snd_timer_free()
939 ti->timer = NULL; in snd_timer_free()
942 list_del(&timer->device_list); in snd_timer_free()
945 if (timer->private_free) in snd_timer_free()
946 timer->private_free(timer); in snd_timer_free()
947 kfree(timer); in snd_timer_free()
953 struct snd_timer *timer = device->device_data; in snd_timer_dev_free() local
954 return snd_timer_free(timer); in snd_timer_dev_free()
959 struct snd_timer *timer = dev->device_data; in snd_timer_dev_register() local
962 if (snd_BUG_ON(!timer || !timer->hw.start || !timer->hw.stop)) in snd_timer_dev_register()
964 if (!(timer->hw.flags & SNDRV_TIMER_HW_SLAVE) && in snd_timer_dev_register()
965 !timer->hw.resolution && timer->hw.c_resolution == NULL) in snd_timer_dev_register()
970 if (timer1->tmr_class > timer->tmr_class) in snd_timer_dev_register()
972 if (timer1->tmr_class < timer->tmr_class) in snd_timer_dev_register()
974 if (timer1->card && timer->card) { in snd_timer_dev_register()
975 if (timer1->card->number > timer->card->number) in snd_timer_dev_register()
977 if (timer1->card->number < timer->card->number) in snd_timer_dev_register()
980 if (timer1->tmr_device > timer->tmr_device) in snd_timer_dev_register()
982 if (timer1->tmr_device < timer->tmr_device) in snd_timer_dev_register()
984 if (timer1->tmr_subdevice > timer->tmr_subdevice) in snd_timer_dev_register()
986 if (timer1->tmr_subdevice < timer->tmr_subdevice) in snd_timer_dev_register()
992 list_add_tail(&timer->device_list, &timer1->device_list); in snd_timer_dev_register()
999 struct snd_timer *timer = device->device_data; in snd_timer_dev_disconnect() local
1003 list_del_init(&timer->device_list); in snd_timer_dev_disconnect()
1005 list_for_each_entry(ti, &timer->open_list_head, open_list) { in snd_timer_dev_disconnect()
1013 void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp) in snd_timer_notify() argument
1019 if (timer->card && timer->card->shutdown) in snd_timer_notify()
1021 if (! (timer->hw.flags & SNDRV_TIMER_HW_SLAVE)) in snd_timer_notify()
1026 spin_lock_irqsave(&timer->lock, flags); in snd_timer_notify()
1030 resolution = snd_timer_hw_resolution(timer); in snd_timer_notify()
1031 list_for_each_entry(ti, &timer->active_list_head, active_list) { in snd_timer_notify()
1038 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_notify()
1058 int snd_timer_global_free(struct snd_timer *timer) in snd_timer_global_free() argument
1060 return snd_timer_free(timer); in snd_timer_global_free()
1064 int snd_timer_global_register(struct snd_timer *timer) in snd_timer_global_register() argument
1069 dev.device_data = timer; in snd_timer_global_register()
1090 struct snd_timer *timer = priv->snd_timer; in snd_timer_s_function() local
1094 snd_timer_interrupt(timer, (long)jiff - (long)priv->last_jiffies); in snd_timer_s_function()
1097 static int snd_timer_s_start(struct snd_timer * timer) in snd_timer_s_start() argument
1102 priv = (struct snd_timer_system_private *) timer->private_data; in snd_timer_s_start()
1104 if (priv->correction > timer->sticks - 1) { in snd_timer_s_start()
1105 priv->correction -= timer->sticks - 1; in snd_timer_s_start()
1108 njiff += timer->sticks - priv->correction; in snd_timer_s_start()
1116 static int snd_timer_s_stop(struct snd_timer * timer) in snd_timer_s_stop() argument
1121 priv = (struct snd_timer_system_private *) timer->private_data; in snd_timer_s_stop()
1125 timer->sticks = priv->last_expires - jiff; in snd_timer_s_stop()
1127 timer->sticks = 1; in snd_timer_s_stop()
1132 static int snd_timer_s_close(struct snd_timer *timer) in snd_timer_s_close() argument
1136 priv = (struct snd_timer_system_private *)timer->private_data; in snd_timer_s_close()
1151 static void snd_timer_free_system(struct snd_timer *timer) in snd_timer_free_system() argument
1153 kfree(timer->private_data); in snd_timer_free_system()
1158 struct snd_timer *timer; in snd_timer_register_system() local
1162 err = snd_timer_global_new("system", SNDRV_TIMER_GLOBAL_SYSTEM, &timer); in snd_timer_register_system()
1165 strcpy(timer->name, "system timer"); in snd_timer_register_system()
1166 timer->hw = snd_timer_system; in snd_timer_register_system()
1169 snd_timer_free(timer); in snd_timer_register_system()
1172 priv->snd_timer = timer; in snd_timer_register_system()
1174 timer->private_data = priv; in snd_timer_register_system()
1175 timer->private_free = snd_timer_free_system; in snd_timer_register_system()
1176 return snd_timer_global_register(timer); in snd_timer_register_system()
1187 struct snd_timer *timer; in snd_timer_proc_read() local
1191 list_for_each_entry(timer, &snd_timer_list, device_list) { in snd_timer_proc_read()
1192 if (timer->card && timer->card->shutdown) in snd_timer_proc_read()
1194 switch (timer->tmr_class) { in snd_timer_proc_read()
1196 snd_iprintf(buffer, "G%i: ", timer->tmr_device); in snd_timer_proc_read()
1200 timer->card->number, timer->tmr_device); in snd_timer_proc_read()
1203 snd_iprintf(buffer, "P%i-%i-%i: ", timer->card->number, in snd_timer_proc_read()
1204 timer->tmr_device, timer->tmr_subdevice); in snd_timer_proc_read()
1207 snd_iprintf(buffer, "?%i-%i-%i-%i: ", timer->tmr_class, in snd_timer_proc_read()
1208 timer->card ? timer->card->number : -1, in snd_timer_proc_read()
1209 timer->tmr_device, timer->tmr_subdevice); in snd_timer_proc_read()
1211 snd_iprintf(buffer, "%s :", timer->name); in snd_timer_proc_read()
1212 if (timer->hw.resolution) in snd_timer_proc_read()
1214 timer->hw.resolution / 1000, in snd_timer_proc_read()
1215 timer->hw.resolution % 1000, in snd_timer_proc_read()
1216 timer->hw.ticks); in snd_timer_proc_read()
1217 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) in snd_timer_proc_read()
1220 list_for_each_entry(ti, &timer->open_list_head, open_list) in snd_timer_proc_read()
1474 static void snd_timer_user_copy_id(struct snd_timer_id *id, struct snd_timer *timer) in snd_timer_user_copy_id() argument
1476 id->dev_class = timer->tmr_class; in snd_timer_user_copy_id()
1478 id->card = timer->card ? timer->card->number : -1; in snd_timer_user_copy_id()
1479 id->device = timer->tmr_device; in snd_timer_user_copy_id()
1480 id->subdevice = timer->tmr_subdevice; in snd_timer_user_copy_id()
1486 struct snd_timer *timer; in snd_timer_user_next_device() local
1496 timer = list_entry(snd_timer_list.next, in snd_timer_user_next_device()
1498 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1505 timer = list_entry(p, struct snd_timer, device_list); in snd_timer_user_next_device()
1506 if (timer->tmr_class > SNDRV_TIMER_CLASS_GLOBAL) { in snd_timer_user_next_device()
1507 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1510 if (timer->tmr_device >= id.device) { in snd_timer_user_next_device()
1511 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1533 timer = list_entry(p, struct snd_timer, device_list); in snd_timer_user_next_device()
1534 if (timer->tmr_class > id.dev_class) { in snd_timer_user_next_device()
1535 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1538 if (timer->tmr_class < id.dev_class) in snd_timer_user_next_device()
1540 if (timer->card->number > id.card) { in snd_timer_user_next_device()
1541 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1544 if (timer->card->number < id.card) in snd_timer_user_next_device()
1546 if (timer->tmr_device > id.device) { in snd_timer_user_next_device()
1547 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1550 if (timer->tmr_device < id.device) in snd_timer_user_next_device()
1552 if (timer->tmr_subdevice > id.subdevice) { in snd_timer_user_next_device()
1553 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1556 if (timer->tmr_subdevice < id.subdevice) in snd_timer_user_next_device()
1558 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1732 t = tu->timeri->timer; in snd_timer_user_info()
1762 t = tu->timeri->timer; in snd_timer_user_params()
2124 struct snd_timer *timer, *n; in snd_timer_free_all() local
2126 list_for_each_entry_safe(timer, n, &snd_timer_list, device_list) in snd_timer_free_all()
2127 snd_timer_free(timer); in snd_timer_free_all()