Lines Matching refs:atimer

148 static void ct_xfitimer_irq_rearm(struct ct_timer *atimer, int ticks)  in ct_xfitimer_irq_rearm()  argument
150 struct hw *hw = atimer->atc->hw; in ct_xfitimer_irq_rearm()
154 if (!atimer->running) in ct_xfitimer_irq_rearm()
156 atimer->running = 1; in ct_xfitimer_irq_rearm()
159 static void ct_xfitimer_irq_stop(struct ct_timer *atimer) in ct_xfitimer_irq_stop() argument
161 if (atimer->running) { in ct_xfitimer_irq_stop()
162 struct hw *hw = atimer->atc->hw; in ct_xfitimer_irq_stop()
165 atimer->running = 0; in ct_xfitimer_irq_stop()
169 static inline unsigned int ct_xfitimer_get_wc(struct ct_timer *atimer) in ct_xfitimer_get_wc() argument
171 struct hw *hw = atimer->atc->hw; in ct_xfitimer_get_wc()
183 static int ct_xfitimer_reprogram(struct ct_timer *atimer, int can_update) in ct_xfitimer_reprogram() argument
190 if (list_empty(&atimer->running_head)) { in ct_xfitimer_reprogram()
191 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_reprogram()
192 atimer->reprogram = 0; /* clear flag */ in ct_xfitimer_reprogram()
196 wc = ct_xfitimer_get_wc(atimer); in ct_xfitimer_reprogram()
197 diff = wc - atimer->wc; in ct_xfitimer_reprogram()
198 atimer->wc = wc; in ct_xfitimer_reprogram()
199 list_for_each_entry(ti, &atimer->running_head, running_list) { in ct_xfitimer_reprogram()
227 ct_xfitimer_irq_rearm(atimer, min_intr); in ct_xfitimer_reprogram()
228 atimer->reprogram = 0; /* clear flag */ in ct_xfitimer_reprogram()
233 static void ct_xfitimer_check_period(struct ct_timer *atimer) in ct_xfitimer_check_period() argument
238 spin_lock_irqsave(&atimer->list_lock, flags); in ct_xfitimer_check_period()
239 list_for_each_entry(ti, &atimer->instance_head, instance_list) { in ct_xfitimer_check_period()
245 spin_unlock_irqrestore(&atimer->list_lock, flags); in ct_xfitimer_check_period()
249 static void ct_xfitimer_callback(struct ct_timer *atimer) in ct_xfitimer_callback() argument
254 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_callback()
255 atimer->irq_handling = 1; in ct_xfitimer_callback()
257 update = ct_xfitimer_reprogram(atimer, 1); in ct_xfitimer_callback()
258 spin_unlock(&atimer->lock); in ct_xfitimer_callback()
260 ct_xfitimer_check_period(atimer); in ct_xfitimer_callback()
261 spin_lock(&atimer->lock); in ct_xfitimer_callback()
262 } while (atimer->reprogram); in ct_xfitimer_callback()
263 atimer->irq_handling = 0; in ct_xfitimer_callback()
264 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_callback()
276 static void ct_xfitimer_update(struct ct_timer *atimer) in ct_xfitimer_update() argument
280 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_update()
281 if (atimer->irq_handling) { in ct_xfitimer_update()
283 atimer->reprogram = 1; in ct_xfitimer_update()
284 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_update()
288 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_update()
289 ct_xfitimer_reprogram(atimer, 0); in ct_xfitimer_update()
290 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_update()
295 struct ct_timer *atimer = ti->timer_base; in ct_xfitimer_start() local
298 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_start()
300 atimer->wc = ct_xfitimer_get_wc(atimer); in ct_xfitimer_start()
303 list_add(&ti->running_list, &atimer->running_head); in ct_xfitimer_start()
304 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_start()
305 ct_xfitimer_update(atimer); in ct_xfitimer_start()
310 struct ct_timer *atimer = ti->timer_base; in ct_xfitimer_stop() local
313 spin_lock_irqsave(&atimer->lock, flags); in ct_xfitimer_stop()
316 spin_unlock_irqrestore(&atimer->lock, flags); in ct_xfitimer_stop()
317 ct_xfitimer_update(atimer); in ct_xfitimer_stop()
320 static void ct_xfitimer_free_global(struct ct_timer *atimer) in ct_xfitimer_free_global() argument
322 ct_xfitimer_irq_stop(atimer); in ct_xfitimer_free_global()
338 ct_timer_instance_new(struct ct_timer *atimer, struct ct_atc_pcm *apcm) in ct_timer_instance_new() argument
348 ti->timer_base = atimer; in ct_timer_instance_new()
351 if (atimer->ops->init) in ct_timer_instance_new()
352 atimer->ops->init(ti); in ct_timer_instance_new()
354 spin_lock_irq(&atimer->list_lock); in ct_timer_instance_new()
355 list_add(&ti->instance_list, &atimer->instance_head); in ct_timer_instance_new()
356 spin_unlock_irq(&atimer->list_lock); in ct_timer_instance_new()
371 struct ct_timer *atimer = ti->timer_base; in ct_timer_start() local
372 atimer->ops->start(ti); in ct_timer_start()
377 struct ct_timer *atimer = ti->timer_base; in ct_timer_stop() local
378 atimer->ops->stop(ti); in ct_timer_stop()
383 struct ct_timer *atimer = ti->timer_base; in ct_timer_instance_free() local
385 atimer->ops->stop(ti); /* to be sure */ in ct_timer_instance_free()
386 if (atimer->ops->free_instance) in ct_timer_instance_free()
387 atimer->ops->free_instance(ti); in ct_timer_instance_free()
389 spin_lock_irq(&atimer->list_lock); in ct_timer_instance_free()
391 spin_unlock_irq(&atimer->list_lock); in ct_timer_instance_free()
411 struct ct_timer *atimer; in ct_timer_new() local
414 atimer = kzalloc(sizeof(*atimer), GFP_KERNEL); in ct_timer_new()
415 if (!atimer) in ct_timer_new()
417 spin_lock_init(&atimer->lock); in ct_timer_new()
418 spin_lock_init(&atimer->list_lock); in ct_timer_new()
419 INIT_LIST_HEAD(&atimer->instance_head); in ct_timer_new()
420 INIT_LIST_HEAD(&atimer->running_head); in ct_timer_new()
421 atimer->atc = atc; in ct_timer_new()
425 atimer->ops = &ct_xfitimer_ops; in ct_timer_new()
426 hw->irq_callback_data = atimer; in ct_timer_new()
430 atimer->ops = &ct_systimer_ops; in ct_timer_new()
432 return atimer; in ct_timer_new()
435 void ct_timer_free(struct ct_timer *atimer) in ct_timer_free() argument
437 struct hw *hw = atimer->atc->hw; in ct_timer_free()
439 if (atimer->ops->free_global) in ct_timer_free()
440 atimer->ops->free_global(atimer); in ct_timer_free()
441 kfree(atimer); in ct_timer_free()