Lines Matching refs:timer
72 static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg) in omap_dm_timer_read_reg() argument
75 return __omap_dm_timer_read(timer, reg, timer->posted); in omap_dm_timer_read_reg()
88 static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, in omap_dm_timer_write_reg() argument
92 __omap_dm_timer_write(timer, reg, value, timer->posted); in omap_dm_timer_write_reg()
95 static void omap_timer_restore_context(struct omap_dm_timer *timer) in omap_timer_restore_context() argument
97 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, in omap_timer_restore_context()
98 timer->context.twer); in omap_timer_restore_context()
99 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, in omap_timer_restore_context()
100 timer->context.tcrr); in omap_timer_restore_context()
101 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, in omap_timer_restore_context()
102 timer->context.tldr); in omap_timer_restore_context()
103 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, in omap_timer_restore_context()
104 timer->context.tmar); in omap_timer_restore_context()
105 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, in omap_timer_restore_context()
106 timer->context.tsicr); in omap_timer_restore_context()
107 writel_relaxed(timer->context.tier, timer->irq_ena); in omap_timer_restore_context()
108 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, in omap_timer_restore_context()
109 timer->context.tclr); in omap_timer_restore_context()
112 static int omap_dm_timer_reset(struct omap_dm_timer *timer) in omap_dm_timer_reset() argument
116 if (timer->revision != 1) in omap_dm_timer_reset()
119 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); in omap_dm_timer_reset()
122 l = __omap_dm_timer_read(timer, in omap_dm_timer_reset()
127 dev_err(&timer->pdev->dev, "Timer failed to reset\n"); in omap_dm_timer_reset()
132 l = __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); in omap_dm_timer_reset()
134 __omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l, 0); in omap_dm_timer_reset()
136 timer->posted = 0; in omap_dm_timer_reset()
141 static int omap_dm_timer_of_set_source(struct omap_dm_timer *timer) in omap_dm_timer_of_set_source() argument
150 if (!timer->fclk) in omap_dm_timer_of_set_source()
153 parent = clk_get(&timer->pdev->dev, NULL); in omap_dm_timer_of_set_source()
157 ret = clk_set_parent(timer->fclk, parent); in omap_dm_timer_of_set_source()
166 static int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) in omap_dm_timer_set_source() argument
173 if (unlikely(!timer) || IS_ERR(timer->fclk)) in omap_dm_timer_set_source()
190 pdata = timer->pdev->dev.platform_data; in omap_dm_timer_set_source()
198 return pdata->set_timer_src(timer->pdev, source); in omap_dm_timer_set_source()
202 if (clk_hw_get_num_parents(__clk_get_hw(timer->fclk)) < 2) in omap_dm_timer_set_source()
206 parent = clk_get(&timer->pdev->dev, parent_name); in omap_dm_timer_set_source()
212 ret = clk_set_parent(timer->fclk, parent); in omap_dm_timer_set_source()
222 static void omap_dm_timer_enable(struct omap_dm_timer *timer) in omap_dm_timer_enable() argument
226 pm_runtime_get_sync(&timer->pdev->dev); in omap_dm_timer_enable()
228 if (!(timer->capability & OMAP_TIMER_ALWON)) { in omap_dm_timer_enable()
229 if (timer->get_context_loss_count) { in omap_dm_timer_enable()
230 c = timer->get_context_loss_count(&timer->pdev->dev); in omap_dm_timer_enable()
231 if (c != timer->ctx_loss_count) { in omap_dm_timer_enable()
232 omap_timer_restore_context(timer); in omap_dm_timer_enable()
233 timer->ctx_loss_count = c; in omap_dm_timer_enable()
236 omap_timer_restore_context(timer); in omap_dm_timer_enable()
241 static void omap_dm_timer_disable(struct omap_dm_timer *timer) in omap_dm_timer_disable() argument
243 pm_runtime_put_sync(&timer->pdev->dev); in omap_dm_timer_disable()
246 static int omap_dm_timer_prepare(struct omap_dm_timer *timer) in omap_dm_timer_prepare() argument
254 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { in omap_dm_timer_prepare()
255 timer->fclk = clk_get(&timer->pdev->dev, "fck"); in omap_dm_timer_prepare()
256 if (WARN_ON_ONCE(IS_ERR(timer->fclk))) { in omap_dm_timer_prepare()
257 dev_err(&timer->pdev->dev, ": No fclk handle.\n"); in omap_dm_timer_prepare()
262 omap_dm_timer_enable(timer); in omap_dm_timer_prepare()
264 if (timer->capability & OMAP_TIMER_NEEDS_RESET) { in omap_dm_timer_prepare()
265 rc = omap_dm_timer_reset(timer); in omap_dm_timer_prepare()
267 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
272 __omap_dm_timer_enable_posted(timer); in omap_dm_timer_prepare()
273 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
275 rc = omap_dm_timer_of_set_source(timer); in omap_dm_timer_prepare()
277 return omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ); in omap_dm_timer_prepare()
299 struct omap_dm_timer *timer = NULL, *t; in _omap_dm_timer_request() local
328 timer = t; in _omap_dm_timer_request()
329 timer->reserved = 1; in _omap_dm_timer_request()
343 if (timer) in _omap_dm_timer_request()
344 timer->reserved = 0; in _omap_dm_timer_request()
345 timer = t; in _omap_dm_timer_request()
346 timer->reserved = 1; in _omap_dm_timer_request()
355 timer = t; in _omap_dm_timer_request()
356 timer->reserved = 1; in _omap_dm_timer_request()
362 timer = t; in _omap_dm_timer_request()
363 timer->reserved = 1; in _omap_dm_timer_request()
370 if (timer && omap_dm_timer_prepare(timer)) { in _omap_dm_timer_request()
371 timer->reserved = 0; in _omap_dm_timer_request()
372 timer = NULL; in _omap_dm_timer_request()
375 if (!timer) in _omap_dm_timer_request()
378 return timer; in _omap_dm_timer_request()
427 static int omap_dm_timer_free(struct omap_dm_timer *timer) in omap_dm_timer_free() argument
429 if (unlikely(!timer)) in omap_dm_timer_free()
432 clk_put(timer->fclk); in omap_dm_timer_free()
434 WARN_ON(!timer->reserved); in omap_dm_timer_free()
435 timer->reserved = 0; in omap_dm_timer_free()
439 int omap_dm_timer_get_irq(struct omap_dm_timer *timer) in omap_dm_timer_get_irq() argument
441 if (timer) in omap_dm_timer_get_irq()
442 return timer->irq; in omap_dm_timer_get_irq()
449 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) in omap_dm_timer_get_fclk() argument
461 struct omap_dm_timer *timer = NULL; in omap_dm_timer_modify_idlect_mask() local
470 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timer_modify_idlect_mask()
473 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_modify_idlect_mask()
489 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) in omap_dm_timer_get_fclk() argument
491 if (timer && !IS_ERR(timer->fclk)) in omap_dm_timer_get_fclk()
492 return timer->fclk; in omap_dm_timer_get_fclk()
505 int omap_dm_timer_trigger(struct omap_dm_timer *timer) in omap_dm_timer_trigger() argument
507 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_trigger()
512 omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); in omap_dm_timer_trigger()
516 static int omap_dm_timer_start(struct omap_dm_timer *timer) in omap_dm_timer_start() argument
520 if (unlikely(!timer)) in omap_dm_timer_start()
523 omap_dm_timer_enable(timer); in omap_dm_timer_start()
525 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_start()
528 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_start()
532 timer->context.tclr = l; in omap_dm_timer_start()
536 static int omap_dm_timer_stop(struct omap_dm_timer *timer) in omap_dm_timer_stop() argument
540 if (unlikely(!timer)) in omap_dm_timer_stop()
543 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) in omap_dm_timer_stop()
544 rate = clk_get_rate(timer->fclk); in omap_dm_timer_stop()
546 __omap_dm_timer_stop(timer, timer->posted, rate); in omap_dm_timer_stop()
553 timer->context.tclr = in omap_dm_timer_stop()
554 omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_stop()
555 omap_dm_timer_disable(timer); in omap_dm_timer_stop()
559 static int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, in omap_dm_timer_set_load() argument
564 if (unlikely(!timer)) in omap_dm_timer_set_load()
567 omap_dm_timer_enable(timer); in omap_dm_timer_set_load()
568 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_load()
573 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_load()
574 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); in omap_dm_timer_set_load()
576 omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); in omap_dm_timer_set_load()
578 timer->context.tclr = l; in omap_dm_timer_set_load()
579 timer->context.tldr = load; in omap_dm_timer_set_load()
580 omap_dm_timer_disable(timer); in omap_dm_timer_set_load()
585 int omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, in omap_dm_timer_set_load_start() argument
590 if (unlikely(!timer)) in omap_dm_timer_set_load_start()
593 omap_dm_timer_enable(timer); in omap_dm_timer_set_load_start()
595 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_load_start()
598 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); in omap_dm_timer_set_load_start()
604 __omap_dm_timer_load_start(timer, l, load, timer->posted); in omap_dm_timer_set_load_start()
607 timer->context.tclr = l; in omap_dm_timer_set_load_start()
608 timer->context.tldr = load; in omap_dm_timer_set_load_start()
609 timer->context.tcrr = load; in omap_dm_timer_set_load_start()
612 static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, in omap_dm_timer_set_match() argument
617 if (unlikely(!timer)) in omap_dm_timer_set_match()
620 omap_dm_timer_enable(timer); in omap_dm_timer_set_match()
621 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_match()
626 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); in omap_dm_timer_set_match()
627 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_match()
630 timer->context.tclr = l; in omap_dm_timer_set_match()
631 timer->context.tmar = match; in omap_dm_timer_set_match()
632 omap_dm_timer_disable(timer); in omap_dm_timer_set_match()
636 static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, in omap_dm_timer_set_pwm() argument
641 if (unlikely(!timer)) in omap_dm_timer_set_pwm()
644 omap_dm_timer_enable(timer); in omap_dm_timer_set_pwm()
645 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_pwm()
653 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_pwm()
656 timer->context.tclr = l; in omap_dm_timer_set_pwm()
657 omap_dm_timer_disable(timer); in omap_dm_timer_set_pwm()
661 static int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, in omap_dm_timer_set_prescaler() argument
666 if (unlikely(!timer) || prescaler < -1 || prescaler > 7) in omap_dm_timer_set_prescaler()
669 omap_dm_timer_enable(timer); in omap_dm_timer_set_prescaler()
670 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_prescaler()
676 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_prescaler()
679 timer->context.tclr = l; in omap_dm_timer_set_prescaler()
680 omap_dm_timer_disable(timer); in omap_dm_timer_set_prescaler()
684 static int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, in omap_dm_timer_set_int_enable() argument
687 if (unlikely(!timer)) in omap_dm_timer_set_int_enable()
690 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_enable()
691 __omap_dm_timer_int_enable(timer, value); in omap_dm_timer_set_int_enable()
694 timer->context.tier = value; in omap_dm_timer_set_int_enable()
695 timer->context.twer = value; in omap_dm_timer_set_int_enable()
696 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_enable()
707 static int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask) in omap_dm_timer_set_int_disable() argument
711 if (unlikely(!timer)) in omap_dm_timer_set_int_disable()
714 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_disable()
716 if (timer->revision == 1) in omap_dm_timer_set_int_disable()
717 l = readl_relaxed(timer->irq_ena) & ~mask; in omap_dm_timer_set_int_disable()
719 writel_relaxed(l, timer->irq_dis); in omap_dm_timer_set_int_disable()
720 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask; in omap_dm_timer_set_int_disable()
721 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, l); in omap_dm_timer_set_int_disable()
724 timer->context.tier &= ~mask; in omap_dm_timer_set_int_disable()
725 timer->context.twer &= ~mask; in omap_dm_timer_set_int_disable()
726 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_disable()
730 static unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) in omap_dm_timer_read_status() argument
734 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_read_status()
739 l = readl_relaxed(timer->irq_stat); in omap_dm_timer_read_status()
744 static int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_status() argument
746 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) in omap_dm_timer_write_status()
749 __omap_dm_timer_write_status(timer, value); in omap_dm_timer_write_status()
754 static unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) in omap_dm_timer_read_counter() argument
756 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_read_counter()
761 return __omap_dm_timer_read_counter(timer, timer->posted); in omap_dm_timer_read_counter()
764 static int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_counter() argument
766 if (unlikely(!timer || pm_runtime_suspended(&timer->pdev->dev))) { in omap_dm_timer_write_counter()
771 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); in omap_dm_timer_write_counter()
774 timer->context.tcrr = value; in omap_dm_timer_write_counter()
780 struct omap_dm_timer *timer; in omap_dm_timers_active() local
782 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timers_active()
783 if (!timer->reserved) in omap_dm_timers_active()
786 if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & in omap_dm_timers_active()
806 struct omap_dm_timer *timer; in omap_dm_timer_probe() local
835 timer = devm_kzalloc(dev, sizeof(*timer), GFP_KERNEL); in omap_dm_timer_probe()
836 if (!timer) in omap_dm_timer_probe()
839 timer->fclk = ERR_PTR(-ENODEV); in omap_dm_timer_probe()
840 timer->io_base = devm_ioremap_resource(dev, mem); in omap_dm_timer_probe()
841 if (IS_ERR(timer->io_base)) in omap_dm_timer_probe()
842 return PTR_ERR(timer->io_base); in omap_dm_timer_probe()
846 timer->capability |= OMAP_TIMER_ALWON; in omap_dm_timer_probe()
848 timer->capability |= OMAP_TIMER_HAS_DSP_IRQ; in omap_dm_timer_probe()
850 timer->capability |= OMAP_TIMER_HAS_PWM; in omap_dm_timer_probe()
852 timer->capability |= OMAP_TIMER_SECURE; in omap_dm_timer_probe()
854 timer->id = pdev->id; in omap_dm_timer_probe()
855 timer->capability = pdata->timer_capability; in omap_dm_timer_probe()
856 timer->reserved = omap_dm_timer_reserved_systimer(timer->id); in omap_dm_timer_probe()
857 timer->get_context_loss_count = pdata->get_context_loss_count; in omap_dm_timer_probe()
861 timer->errata = pdata->timer_errata; in omap_dm_timer_probe()
863 timer->irq = irq->start; in omap_dm_timer_probe()
864 timer->pdev = pdev; in omap_dm_timer_probe()
869 if (!timer->reserved) { in omap_dm_timer_probe()
876 __omap_dm_timer_init_regs(timer); in omap_dm_timer_probe()
882 list_add_tail(&timer->node, &omap_timer_list); in omap_dm_timer_probe()
905 struct omap_dm_timer *timer; in omap_dm_timer_remove() local
910 list_for_each_entry(timer, &omap_timer_list, node) in omap_dm_timer_remove()
911 if (!strcmp(dev_name(&timer->pdev->dev), in omap_dm_timer_remove()
913 list_del(&timer->node); in omap_dm_timer_remove()