Lines Matching refs:timer
71 static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg) in omap_dm_timer_read_reg() argument
74 return __omap_dm_timer_read(timer, reg, timer->posted); in omap_dm_timer_read_reg()
87 static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, in omap_dm_timer_write_reg() argument
91 __omap_dm_timer_write(timer, reg, value, timer->posted); in omap_dm_timer_write_reg()
94 static void omap_timer_restore_context(struct omap_dm_timer *timer) in omap_timer_restore_context() argument
96 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, in omap_timer_restore_context()
97 timer->context.twer); in omap_timer_restore_context()
98 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, in omap_timer_restore_context()
99 timer->context.tcrr); in omap_timer_restore_context()
100 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, in omap_timer_restore_context()
101 timer->context.tldr); in omap_timer_restore_context()
102 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, in omap_timer_restore_context()
103 timer->context.tmar); in omap_timer_restore_context()
104 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, in omap_timer_restore_context()
105 timer->context.tsicr); in omap_timer_restore_context()
106 writel_relaxed(timer->context.tier, timer->irq_ena); in omap_timer_restore_context()
107 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, in omap_timer_restore_context()
108 timer->context.tclr); in omap_timer_restore_context()
111 static int omap_dm_timer_reset(struct omap_dm_timer *timer) in omap_dm_timer_reset() argument
115 if (timer->revision != 1) in omap_dm_timer_reset()
118 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); in omap_dm_timer_reset()
121 l = __omap_dm_timer_read(timer, in omap_dm_timer_reset()
126 dev_err(&timer->pdev->dev, "Timer failed to reset\n"); in omap_dm_timer_reset()
131 l = __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); in omap_dm_timer_reset()
133 __omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l, 0); in omap_dm_timer_reset()
135 timer->posted = 0; in omap_dm_timer_reset()
140 static int omap_dm_timer_prepare(struct omap_dm_timer *timer) in omap_dm_timer_prepare() argument
148 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { in omap_dm_timer_prepare()
149 timer->fclk = clk_get(&timer->pdev->dev, "fck"); in omap_dm_timer_prepare()
150 if (WARN_ON_ONCE(IS_ERR(timer->fclk))) { in omap_dm_timer_prepare()
151 dev_err(&timer->pdev->dev, ": No fclk handle.\n"); in omap_dm_timer_prepare()
156 omap_dm_timer_enable(timer); in omap_dm_timer_prepare()
158 if (timer->capability & OMAP_TIMER_NEEDS_RESET) { in omap_dm_timer_prepare()
159 rc = omap_dm_timer_reset(timer); in omap_dm_timer_prepare()
161 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
166 __omap_dm_timer_enable_posted(timer); in omap_dm_timer_prepare()
167 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
169 return omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); in omap_dm_timer_prepare()
189 struct omap_dm_timer *timer = NULL, *t; in _omap_dm_timer_request() local
218 timer = t; in _omap_dm_timer_request()
219 timer->reserved = 1; in _omap_dm_timer_request()
233 if (timer) in _omap_dm_timer_request()
234 timer->reserved = 0; in _omap_dm_timer_request()
235 timer = t; in _omap_dm_timer_request()
236 timer->reserved = 1; in _omap_dm_timer_request()
245 timer = t; in _omap_dm_timer_request()
246 timer->reserved = 1; in _omap_dm_timer_request()
252 timer = t; in _omap_dm_timer_request()
253 timer->reserved = 1; in _omap_dm_timer_request()
260 if (timer && omap_dm_timer_prepare(timer)) { in _omap_dm_timer_request()
261 timer->reserved = 0; in _omap_dm_timer_request()
262 timer = NULL; in _omap_dm_timer_request()
265 if (!timer) in _omap_dm_timer_request()
268 return timer; in _omap_dm_timer_request()
321 int omap_dm_timer_free(struct omap_dm_timer *timer) in omap_dm_timer_free() argument
323 if (unlikely(!timer)) in omap_dm_timer_free()
326 clk_put(timer->fclk); in omap_dm_timer_free()
328 WARN_ON(!timer->reserved); in omap_dm_timer_free()
329 timer->reserved = 0; in omap_dm_timer_free()
334 void omap_dm_timer_enable(struct omap_dm_timer *timer) in omap_dm_timer_enable() argument
338 pm_runtime_get_sync(&timer->pdev->dev); in omap_dm_timer_enable()
340 if (!(timer->capability & OMAP_TIMER_ALWON)) { in omap_dm_timer_enable()
341 if (timer->get_context_loss_count) { in omap_dm_timer_enable()
342 c = timer->get_context_loss_count(&timer->pdev->dev); in omap_dm_timer_enable()
343 if (c != timer->ctx_loss_count) { in omap_dm_timer_enable()
344 omap_timer_restore_context(timer); in omap_dm_timer_enable()
345 timer->ctx_loss_count = c; in omap_dm_timer_enable()
348 omap_timer_restore_context(timer); in omap_dm_timer_enable()
354 void omap_dm_timer_disable(struct omap_dm_timer *timer) in omap_dm_timer_disable() argument
356 pm_runtime_put_sync(&timer->pdev->dev); in omap_dm_timer_disable()
360 int omap_dm_timer_get_irq(struct omap_dm_timer *timer) in omap_dm_timer_get_irq() argument
362 if (timer) in omap_dm_timer_get_irq()
363 return timer->irq; in omap_dm_timer_get_irq()
377 struct omap_dm_timer *timer = NULL; in omap_dm_timer_modify_idlect_mask() local
386 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timer_modify_idlect_mask()
389 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_modify_idlect_mask()
406 struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) in omap_dm_timer_get_fclk() argument
408 if (timer && !IS_ERR(timer->fclk)) in omap_dm_timer_get_fclk()
409 return timer->fclk; in omap_dm_timer_get_fclk()
424 int omap_dm_timer_trigger(struct omap_dm_timer *timer) in omap_dm_timer_trigger() argument
426 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_trigger()
431 omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); in omap_dm_timer_trigger()
436 int omap_dm_timer_start(struct omap_dm_timer *timer) in omap_dm_timer_start() argument
440 if (unlikely(!timer)) in omap_dm_timer_start()
443 omap_dm_timer_enable(timer); in omap_dm_timer_start()
445 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_start()
448 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_start()
452 timer->context.tclr = l; in omap_dm_timer_start()
457 int omap_dm_timer_stop(struct omap_dm_timer *timer) in omap_dm_timer_stop() argument
461 if (unlikely(!timer)) in omap_dm_timer_stop()
464 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) in omap_dm_timer_stop()
465 rate = clk_get_rate(timer->fclk); in omap_dm_timer_stop()
467 __omap_dm_timer_stop(timer, timer->posted, rate); in omap_dm_timer_stop()
474 timer->context.tclr = in omap_dm_timer_stop()
475 omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_stop()
476 omap_dm_timer_disable(timer); in omap_dm_timer_stop()
481 int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) in omap_dm_timer_set_source() argument
488 if (unlikely(!timer)) in omap_dm_timer_set_source()
491 pdata = timer->pdev->dev.platform_data; in omap_dm_timer_set_source()
502 return pdata->set_timer_src(timer->pdev, source); in omap_dm_timer_set_source()
504 if (IS_ERR(timer->fclk)) in omap_dm_timer_set_source()
521 parent = clk_get(&timer->pdev->dev, parent_name); in omap_dm_timer_set_source()
527 ret = clk_set_parent(timer->fclk, parent); in omap_dm_timer_set_source()
538 int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, in omap_dm_timer_set_load() argument
543 if (unlikely(!timer)) in omap_dm_timer_set_load()
546 omap_dm_timer_enable(timer); in omap_dm_timer_set_load()
547 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_load()
552 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_load()
553 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); in omap_dm_timer_set_load()
555 omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); in omap_dm_timer_set_load()
557 timer->context.tclr = l; in omap_dm_timer_set_load()
558 timer->context.tldr = load; in omap_dm_timer_set_load()
559 omap_dm_timer_disable(timer); in omap_dm_timer_set_load()
565 int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, in omap_dm_timer_set_load_start() argument
570 if (unlikely(!timer)) in omap_dm_timer_set_load_start()
573 omap_dm_timer_enable(timer); in omap_dm_timer_set_load_start()
575 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_load_start()
578 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); in omap_dm_timer_set_load_start()
584 __omap_dm_timer_load_start(timer, l, load, timer->posted); in omap_dm_timer_set_load_start()
587 timer->context.tclr = l; in omap_dm_timer_set_load_start()
588 timer->context.tldr = load; in omap_dm_timer_set_load_start()
589 timer->context.tcrr = load; in omap_dm_timer_set_load_start()
594 int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, in omap_dm_timer_set_match() argument
599 if (unlikely(!timer)) in omap_dm_timer_set_match()
602 omap_dm_timer_enable(timer); in omap_dm_timer_set_match()
603 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_match()
608 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); in omap_dm_timer_set_match()
609 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_match()
612 timer->context.tclr = l; in omap_dm_timer_set_match()
613 timer->context.tmar = match; in omap_dm_timer_set_match()
614 omap_dm_timer_disable(timer); in omap_dm_timer_set_match()
619 int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, in omap_dm_timer_set_pwm() argument
624 if (unlikely(!timer)) in omap_dm_timer_set_pwm()
627 omap_dm_timer_enable(timer); in omap_dm_timer_set_pwm()
628 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_pwm()
636 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_pwm()
639 timer->context.tclr = l; in omap_dm_timer_set_pwm()
640 omap_dm_timer_disable(timer); in omap_dm_timer_set_pwm()
645 int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler) in omap_dm_timer_set_prescaler() argument
649 if (unlikely(!timer)) in omap_dm_timer_set_prescaler()
652 omap_dm_timer_enable(timer); in omap_dm_timer_set_prescaler()
653 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_prescaler()
659 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_prescaler()
662 timer->context.tclr = l; in omap_dm_timer_set_prescaler()
663 omap_dm_timer_disable(timer); in omap_dm_timer_set_prescaler()
668 int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, in omap_dm_timer_set_int_enable() argument
671 if (unlikely(!timer)) in omap_dm_timer_set_int_enable()
674 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_enable()
675 __omap_dm_timer_int_enable(timer, value); in omap_dm_timer_set_int_enable()
678 timer->context.tier = value; in omap_dm_timer_set_int_enable()
679 timer->context.twer = value; in omap_dm_timer_set_int_enable()
680 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_enable()
692 int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask) in omap_dm_timer_set_int_disable() argument
696 if (unlikely(!timer)) in omap_dm_timer_set_int_disable()
699 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_disable()
701 if (timer->revision == 1) in omap_dm_timer_set_int_disable()
702 l = readl_relaxed(timer->irq_ena) & ~mask; in omap_dm_timer_set_int_disable()
704 writel_relaxed(l, timer->irq_dis); in omap_dm_timer_set_int_disable()
705 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask; in omap_dm_timer_set_int_disable()
706 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, l); in omap_dm_timer_set_int_disable()
709 timer->context.tier &= ~mask; in omap_dm_timer_set_int_disable()
710 timer->context.twer &= ~mask; in omap_dm_timer_set_int_disable()
711 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_disable()
716 unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) in omap_dm_timer_read_status() argument
720 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_read_status()
725 l = readl_relaxed(timer->irq_stat); in omap_dm_timer_read_status()
731 int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_status() argument
733 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) in omap_dm_timer_write_status()
736 __omap_dm_timer_write_status(timer, value); in omap_dm_timer_write_status()
742 unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) in omap_dm_timer_read_counter() argument
744 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_read_counter()
749 return __omap_dm_timer_read_counter(timer, timer->posted); in omap_dm_timer_read_counter()
753 int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_counter() argument
755 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_write_counter()
760 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); in omap_dm_timer_write_counter()
763 timer->context.tcrr = value; in omap_dm_timer_write_counter()
770 struct omap_dm_timer *timer; in omap_dm_timers_active() local
772 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timers_active()
773 if (!timer->reserved) in omap_dm_timers_active()
776 if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & in omap_dm_timers_active()
797 struct omap_dm_timer *timer; in omap_dm_timer_probe() local
824 timer = devm_kzalloc(dev, sizeof(struct omap_dm_timer), GFP_KERNEL); in omap_dm_timer_probe()
825 if (!timer) { in omap_dm_timer_probe()
830 timer->fclk = ERR_PTR(-ENODEV); in omap_dm_timer_probe()
831 timer->io_base = devm_ioremap_resource(dev, mem); in omap_dm_timer_probe()
832 if (IS_ERR(timer->io_base)) in omap_dm_timer_probe()
833 return PTR_ERR(timer->io_base); in omap_dm_timer_probe()
837 timer->capability |= OMAP_TIMER_ALWON; in omap_dm_timer_probe()
839 timer->capability |= OMAP_TIMER_HAS_DSP_IRQ; in omap_dm_timer_probe()
841 timer->capability |= OMAP_TIMER_HAS_PWM; in omap_dm_timer_probe()
843 timer->capability |= OMAP_TIMER_SECURE; in omap_dm_timer_probe()
845 timer->id = pdev->id; in omap_dm_timer_probe()
846 timer->capability = pdata->timer_capability; in omap_dm_timer_probe()
847 timer->reserved = omap_dm_timer_reserved_systimer(timer->id); in omap_dm_timer_probe()
848 timer->get_context_loss_count = pdata->get_context_loss_count; in omap_dm_timer_probe()
852 timer->errata = pdata->timer_errata; in omap_dm_timer_probe()
854 timer->irq = irq->start; in omap_dm_timer_probe()
855 timer->pdev = pdev; in omap_dm_timer_probe()
858 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { in omap_dm_timer_probe()
863 if (!timer->reserved) { in omap_dm_timer_probe()
870 __omap_dm_timer_init_regs(timer); in omap_dm_timer_probe()
876 list_add_tail(&timer->node, &omap_timer_list); in omap_dm_timer_probe()
899 struct omap_dm_timer *timer; in omap_dm_timer_remove() local
904 list_for_each_entry(timer, &omap_timer_list, node) in omap_dm_timer_remove()
905 if (!strcmp(dev_name(&timer->pdev->dev), in omap_dm_timer_remove()
907 list_del(&timer->node); in omap_dm_timer_remove()