Lines Matching refs:atimer

144 static void ct_xfitimer_irq_rearm(struct ct_timer *atimer, int ticks)  in ct_xfitimer_irq_rearm()  argument
146 struct hw *hw = atimer->atc->hw; in ct_xfitimer_irq_rearm()
150 if (!atimer->running) in ct_xfitimer_irq_rearm()
152 atimer->running = 1; in ct_xfitimer_irq_rearm()
155 static void ct_xfitimer_irq_stop(struct ct_timer *atimer) in ct_xfitimer_irq_stop() argument
157 if (atimer->running) { in ct_xfitimer_irq_stop()
158 struct hw *hw = atimer->atc->hw; in ct_xfitimer_irq_stop()
161 atimer->running = 0; in ct_xfitimer_irq_stop()
165 static inline unsigned int ct_xfitimer_get_wc(struct ct_timer *atimer) in ct_xfitimer_get_wc() argument
167 struct hw *hw = atimer->atc->hw; in ct_xfitimer_get_wc()
179 static int ct_xfitimer_reprogram(struct ct_timer *atimer, int can_update) in ct_xfitimer_reprogram() argument
186 if (list_empty(&atimer->running_head)) { in ct_xfitimer_reprogram()
187 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_reprogram()
188 atimer->reprogram = 0; /* clear flag */ in ct_xfitimer_reprogram()
192 wc = ct_xfitimer_get_wc(atimer); in ct_xfitimer_reprogram()
193 diff = wc - atimer->wc; in ct_xfitimer_reprogram()
194 atimer->wc = wc; in ct_xfitimer_reprogram()
195 list_for_each_entry(ti, &atimer->running_head, running_list) { in ct_xfitimer_reprogram()
223 ct_xfitimer_irq_rearm(atimer, min_intr); in ct_xfitimer_reprogram()
224 atimer->reprogram = 0; /* clear flag */ in ct_xfitimer_reprogram()
229 static void ct_xfitimer_check_period(struct ct_timer *atimer) in ct_xfitimer_check_period() argument
234 spin_lock_irqsave(&atimer->list_lock, flags); in ct_xfitimer_check_period()
235 list_for_each_entry(ti, &atimer->instance_head, instance_list) { in ct_xfitimer_check_period()
241 spin_unlock_irqrestore(&atimer->list_lock, flags); in ct_xfitimer_check_period()
245 static void ct_xfitimer_callback(struct ct_timer *atimer) in ct_xfitimer_callback() argument
250 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_callback()
251 atimer->irq_handling = 1; in ct_xfitimer_callback()
253 update = ct_xfitimer_reprogram(atimer, 1); in ct_xfitimer_callback()
254 spin_unlock(&atimer->lock); in ct_xfitimer_callback()
256 ct_xfitimer_check_period(atimer); in ct_xfitimer_callback()
257 spin_lock(&atimer->lock); in ct_xfitimer_callback()
258 } while (atimer->reprogram); in ct_xfitimer_callback()
259 atimer->irq_handling = 0; in ct_xfitimer_callback()
260 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_callback()
272 static void ct_xfitimer_update(struct ct_timer *atimer) in ct_xfitimer_update() argument
276 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_update()
277 if (atimer->irq_handling) { in ct_xfitimer_update()
279 atimer->reprogram = 1; in ct_xfitimer_update()
280 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_update()
284 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_update()
285 ct_xfitimer_reprogram(atimer, 0); in ct_xfitimer_update()
286 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_update()
291 struct ct_timer *atimer = ti->timer_base; in ct_xfitimer_start() local
294 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_start()
296 atimer->wc = ct_xfitimer_get_wc(atimer); in ct_xfitimer_start()
299 list_add(&ti->running_list, &atimer->running_head); in ct_xfitimer_start()
300 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_start()
301 ct_xfitimer_update(atimer); in ct_xfitimer_start()
306 struct ct_timer *atimer = ti->timer_base; in ct_xfitimer_stop() local
309 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_stop()
312 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_stop()
313 ct_xfitimer_update(atimer); in ct_xfitimer_stop()
316 static void ct_xfitimer_free_global(struct ct_timer *atimer) in ct_xfitimer_free_global() argument
318 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_free_global()
334 ct_timer_instance_new(struct ct_timer *atimer, struct ct_atc_pcm *apcm) in ct_timer_instance_new() argument
344 ti->timer_base = atimer; in ct_timer_instance_new()
347 if (atimer->ops->init) in ct_timer_instance_new()
348 atimer->ops->init(ti); in ct_timer_instance_new()
350 spin_lock_irq(&atimer->list_lock); in ct_timer_instance_new()
351 list_add(&ti->instance_list, &atimer->instance_head); in ct_timer_instance_new()
352 spin_unlock_irq(&atimer->list_lock); in ct_timer_instance_new()
367 struct ct_timer *atimer = ti->timer_base; in ct_timer_start() local
368 atimer->ops->start(ti); in ct_timer_start()
373 struct ct_timer *atimer = ti->timer_base; in ct_timer_stop() local
374 atimer->ops->stop(ti); in ct_timer_stop()
379 struct ct_timer *atimer = ti->timer_base; in ct_timer_instance_free() local
381 atimer->ops->stop(ti); /* to be sure */ in ct_timer_instance_free()
382 if (atimer->ops->free_instance) in ct_timer_instance_free()
383 atimer->ops->free_instance(ti); in ct_timer_instance_free()
385 spin_lock_irq(&atimer->list_lock); in ct_timer_instance_free()
387 spin_unlock_irq(&atimer->list_lock); in ct_timer_instance_free()
407 struct ct_timer *atimer; in ct_timer_new() local
410 atimer = kzalloc(sizeof(*atimer), GFP_KERNEL); in ct_timer_new()
411 if (!atimer) in ct_timer_new()
413 spin_lock_init(&atimer->lock); in ct_timer_new()
414 spin_lock_init(&atimer->list_lock); in ct_timer_new()
415 INIT_LIST_HEAD(&atimer->instance_head); in ct_timer_new()
416 INIT_LIST_HEAD(&atimer->running_head); in ct_timer_new()
417 atimer->atc = atc; in ct_timer_new()
421 atimer->ops = &ct_xfitimer_ops; in ct_timer_new()
422 hw->irq_callback_data = atimer; in ct_timer_new()
426 atimer->ops = &ct_systimer_ops; in ct_timer_new()
428 return atimer; in ct_timer_new()
431 void ct_timer_free(struct ct_timer *atimer) in ct_timer_free() argument
433 struct hw *hw = atimer->atc->hw; in ct_timer_free()
435 if (atimer->ops->free_global) in ct_timer_free()
436 atimer->ops->free_global(atimer); in ct_timer_free()
437 kfree(atimer); in ct_timer_free()