Lines Matching refs:atimer

147 static void ct_xfitimer_irq_rearm(struct ct_timer *atimer, int ticks)  in ct_xfitimer_irq_rearm()  argument
149 struct hw *hw = atimer->atc->hw; in ct_xfitimer_irq_rearm()
153 if (!atimer->running) in ct_xfitimer_irq_rearm()
155 atimer->running = 1; in ct_xfitimer_irq_rearm()
158 static void ct_xfitimer_irq_stop(struct ct_timer *atimer) in ct_xfitimer_irq_stop() argument
160 if (atimer->running) { in ct_xfitimer_irq_stop()
161 struct hw *hw = atimer->atc->hw; in ct_xfitimer_irq_stop()
164 atimer->running = 0; in ct_xfitimer_irq_stop()
168 static inline unsigned int ct_xfitimer_get_wc(struct ct_timer *atimer) in ct_xfitimer_get_wc() argument
170 struct hw *hw = atimer->atc->hw; in ct_xfitimer_get_wc()
182 static int ct_xfitimer_reprogram(struct ct_timer *atimer, int can_update) in ct_xfitimer_reprogram() argument
189 if (list_empty(&atimer->running_head)) { in ct_xfitimer_reprogram()
190 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_reprogram()
191 atimer->reprogram = 0; /* clear flag */ in ct_xfitimer_reprogram()
195 wc = ct_xfitimer_get_wc(atimer); in ct_xfitimer_reprogram()
196 diff = wc - atimer->wc; in ct_xfitimer_reprogram()
197 atimer->wc = wc; in ct_xfitimer_reprogram()
198 list_for_each_entry(ti, &atimer->running_head, running_list) { in ct_xfitimer_reprogram()
226 ct_xfitimer_irq_rearm(atimer, min_intr); in ct_xfitimer_reprogram()
227 atimer->reprogram = 0; /* clear flag */ in ct_xfitimer_reprogram()
232 static void ct_xfitimer_check_period(struct ct_timer *atimer) in ct_xfitimer_check_period() argument
237 spin_lock_irqsave(&atimer->list_lock, flags); in ct_xfitimer_check_period()
238 list_for_each_entry(ti, &atimer->instance_head, instance_list) { in ct_xfitimer_check_period()
244 spin_unlock_irqrestore(&atimer->list_lock, flags); in ct_xfitimer_check_period()
248 static void ct_xfitimer_callback(struct ct_timer *atimer) in ct_xfitimer_callback() argument
253 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_callback()
254 atimer->irq_handling = 1; in ct_xfitimer_callback()
256 update = ct_xfitimer_reprogram(atimer, 1); in ct_xfitimer_callback()
257 spin_unlock(&atimer->lock); in ct_xfitimer_callback()
259 ct_xfitimer_check_period(atimer); in ct_xfitimer_callback()
260 spin_lock(&atimer->lock); in ct_xfitimer_callback()
261 } while (atimer->reprogram); in ct_xfitimer_callback()
262 atimer->irq_handling = 0; in ct_xfitimer_callback()
263 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_callback()
275 static void ct_xfitimer_update(struct ct_timer *atimer) in ct_xfitimer_update() argument
279 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_update()
280 if (atimer->irq_handling) { in ct_xfitimer_update()
282 atimer->reprogram = 1; in ct_xfitimer_update()
283 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_update()
287 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_update()
288 ct_xfitimer_reprogram(atimer, 0); in ct_xfitimer_update()
289 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_update()
294 struct ct_timer *atimer = ti->timer_base; in ct_xfitimer_start() local
297 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_start()
299 atimer->wc = ct_xfitimer_get_wc(atimer); in ct_xfitimer_start()
302 list_add(&ti->running_list, &atimer->running_head); in ct_xfitimer_start()
303 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_start()
304 ct_xfitimer_update(atimer); in ct_xfitimer_start()
309 struct ct_timer *atimer = ti->timer_base; in ct_xfitimer_stop() local
312 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_stop()
315 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_stop()
316 ct_xfitimer_update(atimer); in ct_xfitimer_stop()
319 static void ct_xfitimer_free_global(struct ct_timer *atimer) in ct_xfitimer_free_global() argument
321 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_free_global()
337 ct_timer_instance_new(struct ct_timer *atimer, struct ct_atc_pcm *apcm) in ct_timer_instance_new() argument
347 ti->timer_base = atimer; in ct_timer_instance_new()
350 if (atimer->ops->init) in ct_timer_instance_new()
351 atimer->ops->init(ti); in ct_timer_instance_new()
353 spin_lock_irq(&atimer->list_lock); in ct_timer_instance_new()
354 list_add(&ti->instance_list, &atimer->instance_head); in ct_timer_instance_new()
355 spin_unlock_irq(&atimer->list_lock); in ct_timer_instance_new()
370 struct ct_timer *atimer = ti->timer_base; in ct_timer_start() local
371 atimer->ops->start(ti); in ct_timer_start()
376 struct ct_timer *atimer = ti->timer_base; in ct_timer_stop() local
377 atimer->ops->stop(ti); in ct_timer_stop()
382 struct ct_timer *atimer = ti->timer_base; in ct_timer_instance_free() local
384 atimer->ops->stop(ti); /* to be sure */ in ct_timer_instance_free()
385 if (atimer->ops->free_instance) in ct_timer_instance_free()
386 atimer->ops->free_instance(ti); in ct_timer_instance_free()
388 spin_lock_irq(&atimer->list_lock); in ct_timer_instance_free()
390 spin_unlock_irq(&atimer->list_lock); in ct_timer_instance_free()
410 struct ct_timer *atimer; in ct_timer_new() local
413 atimer = kzalloc(sizeof(*atimer), GFP_KERNEL); in ct_timer_new()
414 if (!atimer) in ct_timer_new()
416 spin_lock_init(&atimer->lock); in ct_timer_new()
417 spin_lock_init(&atimer->list_lock); in ct_timer_new()
418 INIT_LIST_HEAD(&atimer->instance_head); in ct_timer_new()
419 INIT_LIST_HEAD(&atimer->running_head); in ct_timer_new()
420 atimer->atc = atc; in ct_timer_new()
424 atimer->ops = &ct_xfitimer_ops; in ct_timer_new()
425 hw->irq_callback_data = atimer; in ct_timer_new()
429 atimer->ops = &ct_systimer_ops; in ct_timer_new()
431 return atimer; in ct_timer_new()
434 void ct_timer_free(struct ct_timer *atimer) in ct_timer_free() argument
436 struct hw *hw = atimer->atc->hw; in ct_timer_free()
438 if (atimer->ops->free_global) in ct_timer_free()
439 atimer->ops->free_global(atimer); in ct_timer_free()
440 kfree(atimer); in ct_timer_free()