Lines Matching refs:timer

79 static int snd_timer_free(struct snd_timer *timer);
84 static void snd_timer_reschedule(struct snd_timer * timer, unsigned long ticks_left);
91 struct snd_timer *timer) in snd_timer_instance_new() argument
108 timeri->timer = timer; in snd_timer_instance_new()
109 if (timer && !try_module_get(timer->module)) { in snd_timer_instance_new()
123 struct snd_timer *timer = NULL; in snd_timer_find() local
125 list_for_each_entry(timer, &snd_timer_list, device_list) { in snd_timer_find()
126 if (timer->tmr_class != tid->dev_class) in snd_timer_find()
128 if ((timer->tmr_class == SNDRV_TIMER_CLASS_CARD || in snd_timer_find()
129 timer->tmr_class == SNDRV_TIMER_CLASS_PCM) && in snd_timer_find()
130 (timer->card == NULL || in snd_timer_find()
131 timer->card->number != tid->card)) in snd_timer_find()
133 if (timer->tmr_device != tid->device) in snd_timer_find()
135 if (timer->tmr_subdevice != tid->subdevice) in snd_timer_find()
137 return timer; in snd_timer_find()
171 struct snd_timer *timer; in snd_timer_check_slave() local
175 list_for_each_entry(timer, &snd_timer_list, device_list) { in snd_timer_check_slave()
176 list_for_each_entry(master, &timer->open_list_head, open_list) { in snd_timer_check_slave()
179 if (master->timer->num_instances >= in snd_timer_check_slave()
180 master->timer->max_instances) in snd_timer_check_slave()
184 master->timer->num_instances++; in snd_timer_check_slave()
187 slave->timer = master->timer; in snd_timer_check_slave()
210 if (master->timer->num_instances >= in snd_timer_check_master()
211 master->timer->max_instances) in snd_timer_check_master()
214 master->timer->num_instances++; in snd_timer_check_master()
216 spin_lock(&master->timer->lock); in snd_timer_check_master()
218 slave->timer = master->timer; in snd_timer_check_master()
222 spin_unlock(&master->timer->lock); in snd_timer_check_master()
240 struct snd_timer *timer; in snd_timer_open() local
273 timer = snd_timer_find(tid); in snd_timer_open()
275 if (!timer) { in snd_timer_open()
279 timer = snd_timer_find(tid); in snd_timer_open()
282 if (!timer) { in snd_timer_open()
286 if (!list_empty(&timer->open_list_head)) { in snd_timer_open()
288 list_entry(timer->open_list_head.next, in snd_timer_open()
295 if (timer->num_instances >= timer->max_instances) { in snd_timer_open()
299 timeri = snd_timer_instance_new(owner, timer); in snd_timer_open()
305 if (timer->card) in snd_timer_open()
306 get_device(&timer->card->card_dev); in snd_timer_open()
310 if (list_empty(&timer->open_list_head) && timer->hw.open) { in snd_timer_open()
311 err = timer->hw.open(timer); in snd_timer_open()
317 if (timer->card) in snd_timer_open()
318 card_dev_to_put = &timer->card->card_dev; in snd_timer_open()
319 module_put(timer->module); in snd_timer_open()
324 list_add_tail(&timeri->open_list, &timer->open_list_head); in snd_timer_open()
325 timer->num_instances++; in snd_timer_open()
349 struct snd_timer *timer = timeri->timer; in snd_timer_close_locked() local
352 if (timer) { in snd_timer_close_locked()
353 spin_lock_irq(&timer->lock); in snd_timer_close_locked()
355 spin_unlock_irq(&timer->lock); in snd_timer_close_locked()
363 if (timer) { in snd_timer_close_locked()
364 timer->num_instances--; in snd_timer_close_locked()
366 spin_lock_irq(&timer->lock); in snd_timer_close_locked()
368 spin_unlock_irq(&timer->lock); in snd_timer_close_locked()
370 spin_lock_irq(&timer->lock); in snd_timer_close_locked()
372 spin_unlock_irq(&timer->lock); in snd_timer_close_locked()
376 spin_lock(&timer->lock); in snd_timer_close_locked()
380 timer->num_instances--; in snd_timer_close_locked()
382 slave->timer = NULL; in snd_timer_close_locked()
386 spin_unlock(&timer->lock); in snd_timer_close_locked()
391 timer = NULL; in snd_timer_close_locked()
399 if (timer) { in snd_timer_close_locked()
400 if (list_empty(&timer->open_list_head) && timer->hw.close) in snd_timer_close_locked()
401 timer->hw.close(timer); in snd_timer_close_locked()
403 if (timer->card) in snd_timer_close_locked()
404 *card_devp_to_put = &timer->card->card_dev; in snd_timer_close_locked()
405 module_put(timer->module); in snd_timer_close_locked()
432 static unsigned long snd_timer_hw_resolution(struct snd_timer *timer) in snd_timer_hw_resolution() argument
434 if (timer->hw.c_resolution) in snd_timer_hw_resolution()
435 return timer->hw.c_resolution(timer); in snd_timer_hw_resolution()
437 return timer->hw.resolution; in snd_timer_hw_resolution()
442 struct snd_timer * timer; in snd_timer_resolution() local
448 timer = timeri->timer; in snd_timer_resolution()
449 if (timer) { in snd_timer_resolution()
450 spin_lock_irqsave(&timer->lock, flags); in snd_timer_resolution()
451 ret = snd_timer_hw_resolution(timer); in snd_timer_resolution()
452 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_resolution()
460 struct snd_timer *timer = ti->timer; in snd_timer_notify1() local
472 if (timer && in snd_timer_notify1()
475 resolution = snd_timer_hw_resolution(timer); in snd_timer_notify1()
480 if (timer == NULL) in snd_timer_notify1()
482 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) in snd_timer_notify1()
493 struct snd_timer *timer; in snd_timer_start1() local
497 timer = timeri->timer; in snd_timer_start1()
498 if (!timer) in snd_timer_start1()
501 spin_lock_irqsave(&timer->lock, flags); in snd_timer_start1()
506 if (timer->card && timer->card->shutdown) { in snd_timer_start1()
522 list_move_tail(&timeri->active_list, &timer->active_list_head); in snd_timer_start1()
523 if (timer->running) { in snd_timer_start1()
524 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) in snd_timer_start1()
526 timer->flags |= SNDRV_TIMER_FLG_RESCHED; in snd_timer_start1()
531 timer->sticks = ticks; in snd_timer_start1()
532 timer->hw.start(timer); in snd_timer_start1()
534 timer->running++; in snd_timer_start1()
541 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_start1()
562 if (timeri->master && timeri->timer) { in snd_timer_start_slave()
563 spin_lock(&timeri->timer->lock); in snd_timer_start_slave()
568 spin_unlock(&timeri->timer->lock); in snd_timer_start_slave()
579 struct snd_timer *timer; in snd_timer_stop1() local
583 timer = timeri->timer; in snd_timer_stop1()
584 if (!timer) in snd_timer_stop1()
586 spin_lock_irqsave(&timer->lock, flags); in snd_timer_stop1()
594 if (timer->card && timer->card->shutdown) in snd_timer_stop1()
601 !(--timer->running)) { in snd_timer_stop1()
602 timer->hw.stop(timer); in snd_timer_stop1()
603 if (timer->flags & SNDRV_TIMER_FLG_RESCHED) { in snd_timer_stop1()
604 timer->flags &= ~SNDRV_TIMER_FLG_RESCHED; in snd_timer_stop1()
605 snd_timer_reschedule(timer, 0); in snd_timer_stop1()
606 if (timer->flags & SNDRV_TIMER_FLG_CHANGE) { in snd_timer_stop1()
607 timer->flags &= ~SNDRV_TIMER_FLG_CHANGE; in snd_timer_stop1()
608 timer->hw.start(timer); in snd_timer_stop1()
620 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_stop1()
635 if (timeri->timer) { in snd_timer_stop_slave()
636 spin_lock(&timeri->timer->lock); in snd_timer_stop_slave()
641 spin_unlock(&timeri->timer->lock); in snd_timer_stop_slave()
709 static void snd_timer_reschedule(struct snd_timer * timer, unsigned long ticks_left) in snd_timer_reschedule() argument
714 list_for_each_entry(ti, &timer->active_list_head, active_list) { in snd_timer_reschedule()
718 timer->running++; in snd_timer_reschedule()
726 timer->flags &= ~SNDRV_TIMER_FLG_RESCHED; in snd_timer_reschedule()
729 if (ticks > timer->hw.ticks) in snd_timer_reschedule()
730 ticks = timer->hw.ticks; in snd_timer_reschedule()
732 timer->flags |= SNDRV_TIMER_FLG_CHANGE; in snd_timer_reschedule()
733 timer->sticks = ticks; in snd_timer_reschedule()
737 static void snd_timer_process_callbacks(struct snd_timer *timer, in snd_timer_process_callbacks() argument
755 spin_unlock(&timer->lock); in snd_timer_process_callbacks()
758 spin_lock(&timer->lock); in snd_timer_process_callbacks()
765 static void snd_timer_clear_callbacks(struct snd_timer *timer, in snd_timer_clear_callbacks() argument
770 spin_lock_irqsave(&timer->lock, flags); in snd_timer_clear_callbacks()
773 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_clear_callbacks()
782 struct snd_timer *timer = (struct snd_timer *) arg; in snd_timer_tasklet() local
785 if (timer->card && timer->card->shutdown) { in snd_timer_tasklet()
786 snd_timer_clear_callbacks(timer, &timer->sack_list_head); in snd_timer_tasklet()
790 spin_lock_irqsave(&timer->lock, flags); in snd_timer_tasklet()
791 snd_timer_process_callbacks(timer, &timer->sack_list_head); in snd_timer_tasklet()
792 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_tasklet()
801 void snd_timer_interrupt(struct snd_timer * timer, unsigned long ticks_left) in snd_timer_interrupt() argument
809 if (timer == NULL) in snd_timer_interrupt()
812 if (timer->card && timer->card->shutdown) { in snd_timer_interrupt()
813 snd_timer_clear_callbacks(timer, &timer->ack_list_head); in snd_timer_interrupt()
817 spin_lock_irqsave(&timer->lock, flags); in snd_timer_interrupt()
820 resolution = snd_timer_hw_resolution(timer); in snd_timer_interrupt()
827 list_for_each_entry_safe(ti, tmp, &timer->active_list_head, in snd_timer_interrupt()
845 --timer->running; in snd_timer_interrupt()
848 if ((timer->hw.flags & SNDRV_TIMER_HW_TASKLET) || in snd_timer_interrupt()
850 ack_list_head = &timer->ack_list_head; in snd_timer_interrupt()
852 ack_list_head = &timer->sack_list_head; in snd_timer_interrupt()
862 if (timer->flags & SNDRV_TIMER_FLG_RESCHED) in snd_timer_interrupt()
863 snd_timer_reschedule(timer, timer->sticks); in snd_timer_interrupt()
864 if (timer->running) { in snd_timer_interrupt()
865 if (timer->hw.flags & SNDRV_TIMER_HW_STOP) { in snd_timer_interrupt()
866 timer->hw.stop(timer); in snd_timer_interrupt()
867 timer->flags |= SNDRV_TIMER_FLG_CHANGE; in snd_timer_interrupt()
869 if (!(timer->hw.flags & SNDRV_TIMER_HW_AUTO) || in snd_timer_interrupt()
870 (timer->flags & SNDRV_TIMER_FLG_CHANGE)) { in snd_timer_interrupt()
872 timer->flags &= ~SNDRV_TIMER_FLG_CHANGE; in snd_timer_interrupt()
873 timer->hw.start(timer); in snd_timer_interrupt()
876 timer->hw.stop(timer); in snd_timer_interrupt()
880 snd_timer_process_callbacks(timer, &timer->ack_list_head); in snd_timer_interrupt()
883 use_tasklet = !list_empty(&timer->sack_list_head); in snd_timer_interrupt()
884 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_interrupt()
887 tasklet_schedule(&timer->task_queue); in snd_timer_interrupt()
898 struct snd_timer *timer; in snd_timer_new() local
915 timer = kzalloc(sizeof(*timer), GFP_KERNEL); in snd_timer_new()
916 if (!timer) in snd_timer_new()
918 timer->tmr_class = tid->dev_class; in snd_timer_new()
919 timer->card = card; in snd_timer_new()
920 timer->tmr_device = tid->device; in snd_timer_new()
921 timer->tmr_subdevice = tid->subdevice; in snd_timer_new()
923 strlcpy(timer->id, id, sizeof(timer->id)); in snd_timer_new()
924 timer->sticks = 1; in snd_timer_new()
925 INIT_LIST_HEAD(&timer->device_list); in snd_timer_new()
926 INIT_LIST_HEAD(&timer->open_list_head); in snd_timer_new()
927 INIT_LIST_HEAD(&timer->active_list_head); in snd_timer_new()
928 INIT_LIST_HEAD(&timer->ack_list_head); in snd_timer_new()
929 INIT_LIST_HEAD(&timer->sack_list_head); in snd_timer_new()
930 spin_lock_init(&timer->lock); in snd_timer_new()
931 tasklet_init(&timer->task_queue, snd_timer_tasklet, in snd_timer_new()
932 (unsigned long)timer); in snd_timer_new()
933 timer->max_instances = 1000; /* default limit per timer */ in snd_timer_new()
935 timer->module = card->module; in snd_timer_new()
936 err = snd_device_new(card, SNDRV_DEV_TIMER, timer, &ops); in snd_timer_new()
938 snd_timer_free(timer); in snd_timer_new()
943 *rtimer = timer; in snd_timer_new()
948 static int snd_timer_free(struct snd_timer *timer) in snd_timer_free() argument
950 if (!timer) in snd_timer_free()
954 if (! list_empty(&timer->open_list_head)) { in snd_timer_free()
957 pr_warn("ALSA: timer %p is busy?\n", timer); in snd_timer_free()
958 list_for_each_safe(p, n, &timer->open_list_head) { in snd_timer_free()
961 ti->timer = NULL; in snd_timer_free()
964 list_del(&timer->device_list); in snd_timer_free()
967 if (timer->private_free) in snd_timer_free()
968 timer->private_free(timer); in snd_timer_free()
969 kfree(timer); in snd_timer_free()
975 struct snd_timer *timer = device->device_data; in snd_timer_dev_free() local
976 return snd_timer_free(timer); in snd_timer_dev_free()
981 struct snd_timer *timer = dev->device_data; in snd_timer_dev_register() local
984 if (snd_BUG_ON(!timer || !timer->hw.start || !timer->hw.stop)) in snd_timer_dev_register()
986 if (!(timer->hw.flags & SNDRV_TIMER_HW_SLAVE) && in snd_timer_dev_register()
987 !timer->hw.resolution && timer->hw.c_resolution == NULL) in snd_timer_dev_register()
992 if (timer1->tmr_class > timer->tmr_class) in snd_timer_dev_register()
994 if (timer1->tmr_class < timer->tmr_class) in snd_timer_dev_register()
996 if (timer1->card && timer->card) { in snd_timer_dev_register()
997 if (timer1->card->number > timer->card->number) in snd_timer_dev_register()
999 if (timer1->card->number < timer->card->number) in snd_timer_dev_register()
1002 if (timer1->tmr_device > timer->tmr_device) in snd_timer_dev_register()
1004 if (timer1->tmr_device < timer->tmr_device) in snd_timer_dev_register()
1006 if (timer1->tmr_subdevice > timer->tmr_subdevice) in snd_timer_dev_register()
1008 if (timer1->tmr_subdevice < timer->tmr_subdevice) in snd_timer_dev_register()
1014 list_add_tail(&timer->device_list, &timer1->device_list); in snd_timer_dev_register()
1021 struct snd_timer *timer = device->device_data; in snd_timer_dev_disconnect() local
1025 list_del_init(&timer->device_list); in snd_timer_dev_disconnect()
1027 list_for_each_entry(ti, &timer->open_list_head, open_list) { in snd_timer_dev_disconnect()
1035 void snd_timer_notify(struct snd_timer *timer, int event, struct timespec *tstamp) in snd_timer_notify() argument
1041 if (timer->card && timer->card->shutdown) in snd_timer_notify()
1043 if (! (timer->hw.flags & SNDRV_TIMER_HW_SLAVE)) in snd_timer_notify()
1048 spin_lock_irqsave(&timer->lock, flags); in snd_timer_notify()
1052 resolution = snd_timer_hw_resolution(timer); in snd_timer_notify()
1053 list_for_each_entry(ti, &timer->active_list_head, active_list) { in snd_timer_notify()
1060 spin_unlock_irqrestore(&timer->lock, flags); in snd_timer_notify()
1080 int snd_timer_global_free(struct snd_timer *timer) in snd_timer_global_free() argument
1082 return snd_timer_free(timer); in snd_timer_global_free()
1086 int snd_timer_global_register(struct snd_timer *timer) in snd_timer_global_register() argument
1091 dev.device_data = timer; in snd_timer_global_register()
1112 struct snd_timer *timer = priv->snd_timer; in snd_timer_s_function() local
1116 snd_timer_interrupt(timer, (long)jiff - (long)priv->last_jiffies); in snd_timer_s_function()
1119 static int snd_timer_s_start(struct snd_timer * timer) in snd_timer_s_start() argument
1124 priv = (struct snd_timer_system_private *) timer->private_data; in snd_timer_s_start()
1126 if (priv->correction > timer->sticks - 1) { in snd_timer_s_start()
1127 priv->correction -= timer->sticks - 1; in snd_timer_s_start()
1130 njiff += timer->sticks - priv->correction; in snd_timer_s_start()
1138 static int snd_timer_s_stop(struct snd_timer * timer) in snd_timer_s_stop() argument
1143 priv = (struct snd_timer_system_private *) timer->private_data; in snd_timer_s_stop()
1147 timer->sticks = priv->last_expires - jiff; in snd_timer_s_stop()
1149 timer->sticks = 1; in snd_timer_s_stop()
1154 static int snd_timer_s_close(struct snd_timer *timer) in snd_timer_s_close() argument
1158 priv = (struct snd_timer_system_private *)timer->private_data; in snd_timer_s_close()
1173 static void snd_timer_free_system(struct snd_timer *timer) in snd_timer_free_system() argument
1175 kfree(timer->private_data); in snd_timer_free_system()
1180 struct snd_timer *timer; in snd_timer_register_system() local
1184 err = snd_timer_global_new("system", SNDRV_TIMER_GLOBAL_SYSTEM, &timer); in snd_timer_register_system()
1187 strcpy(timer->name, "system timer"); in snd_timer_register_system()
1188 timer->hw = snd_timer_system; in snd_timer_register_system()
1191 snd_timer_free(timer); in snd_timer_register_system()
1194 priv->snd_timer = timer; in snd_timer_register_system()
1196 timer->private_data = priv; in snd_timer_register_system()
1197 timer->private_free = snd_timer_free_system; in snd_timer_register_system()
1198 return snd_timer_global_register(timer); in snd_timer_register_system()
1209 struct snd_timer *timer; in snd_timer_proc_read() local
1213 list_for_each_entry(timer, &snd_timer_list, device_list) { in snd_timer_proc_read()
1214 if (timer->card && timer->card->shutdown) in snd_timer_proc_read()
1216 switch (timer->tmr_class) { in snd_timer_proc_read()
1218 snd_iprintf(buffer, "G%i: ", timer->tmr_device); in snd_timer_proc_read()
1222 timer->card->number, timer->tmr_device); in snd_timer_proc_read()
1225 snd_iprintf(buffer, "P%i-%i-%i: ", timer->card->number, in snd_timer_proc_read()
1226 timer->tmr_device, timer->tmr_subdevice); in snd_timer_proc_read()
1229 snd_iprintf(buffer, "?%i-%i-%i-%i: ", timer->tmr_class, in snd_timer_proc_read()
1230 timer->card ? timer->card->number : -1, in snd_timer_proc_read()
1231 timer->tmr_device, timer->tmr_subdevice); in snd_timer_proc_read()
1233 snd_iprintf(buffer, "%s :", timer->name); in snd_timer_proc_read()
1234 if (timer->hw.resolution) in snd_timer_proc_read()
1236 timer->hw.resolution / 1000, in snd_timer_proc_read()
1237 timer->hw.resolution % 1000, in snd_timer_proc_read()
1238 timer->hw.ticks); in snd_timer_proc_read()
1239 if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) in snd_timer_proc_read()
1242 list_for_each_entry(ti, &timer->open_list_head, open_list) in snd_timer_proc_read()
1496 static void snd_timer_user_copy_id(struct snd_timer_id *id, struct snd_timer *timer) in snd_timer_user_copy_id() argument
1498 id->dev_class = timer->tmr_class; in snd_timer_user_copy_id()
1500 id->card = timer->card ? timer->card->number : -1; in snd_timer_user_copy_id()
1501 id->device = timer->tmr_device; in snd_timer_user_copy_id()
1502 id->subdevice = timer->tmr_subdevice; in snd_timer_user_copy_id()
1508 struct snd_timer *timer; in snd_timer_user_next_device() local
1518 timer = list_entry(snd_timer_list.next, in snd_timer_user_next_device()
1520 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1527 timer = list_entry(p, struct snd_timer, device_list); in snd_timer_user_next_device()
1528 if (timer->tmr_class > SNDRV_TIMER_CLASS_GLOBAL) { in snd_timer_user_next_device()
1529 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1532 if (timer->tmr_device >= id.device) { in snd_timer_user_next_device()
1533 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1555 timer = list_entry(p, struct snd_timer, device_list); in snd_timer_user_next_device()
1556 if (timer->tmr_class > id.dev_class) { in snd_timer_user_next_device()
1557 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1560 if (timer->tmr_class < id.dev_class) in snd_timer_user_next_device()
1562 if (timer->card->number > id.card) { in snd_timer_user_next_device()
1563 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1566 if (timer->card->number < id.card) in snd_timer_user_next_device()
1568 if (timer->tmr_device > id.device) { in snd_timer_user_next_device()
1569 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1572 if (timer->tmr_device < id.device) in snd_timer_user_next_device()
1574 if (timer->tmr_subdevice > id.subdevice) { in snd_timer_user_next_device()
1575 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1578 if (timer->tmr_subdevice < id.subdevice) in snd_timer_user_next_device()
1580 snd_timer_user_copy_id(&id, timer); in snd_timer_user_next_device()
1754 t = tu->timeri->timer; in snd_timer_user_info()
1784 t = tu->timeri->timer; in snd_timer_user_params()
2158 struct snd_timer *timer, *n; in snd_timer_free_all() local
2160 list_for_each_entry_safe(timer, n, &snd_timer_list, device_list) in snd_timer_free_all()
2161 snd_timer_free(timer); in snd_timer_free_all()