Lines Matching refs:timer

56 static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg)  in omap_dm_timer_read_reg()  argument
59 return __omap_dm_timer_read(timer, reg, timer->posted); in omap_dm_timer_read_reg()
72 static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg, in omap_dm_timer_write_reg() argument
76 __omap_dm_timer_write(timer, reg, value, timer->posted); in omap_dm_timer_write_reg()
79 static void omap_timer_restore_context(struct omap_dm_timer *timer) in omap_timer_restore_context() argument
81 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, in omap_timer_restore_context()
82 timer->context.twer); in omap_timer_restore_context()
83 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, in omap_timer_restore_context()
84 timer->context.tcrr); in omap_timer_restore_context()
85 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, in omap_timer_restore_context()
86 timer->context.tldr); in omap_timer_restore_context()
87 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, in omap_timer_restore_context()
88 timer->context.tmar); in omap_timer_restore_context()
89 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, in omap_timer_restore_context()
90 timer->context.tsicr); in omap_timer_restore_context()
91 writel_relaxed(timer->context.tier, timer->irq_ena); in omap_timer_restore_context()
92 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, in omap_timer_restore_context()
93 timer->context.tclr); in omap_timer_restore_context()
96 static void omap_timer_save_context(struct omap_dm_timer *timer) in omap_timer_save_context() argument
98 timer->context.tclr = in omap_timer_save_context()
99 omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_timer_save_context()
100 timer->context.twer = in omap_timer_save_context()
101 omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG); in omap_timer_save_context()
102 timer->context.tldr = in omap_timer_save_context()
103 omap_dm_timer_read_reg(timer, OMAP_TIMER_LOAD_REG); in omap_timer_save_context()
104 timer->context.tmar = in omap_timer_save_context()
105 omap_dm_timer_read_reg(timer, OMAP_TIMER_MATCH_REG); in omap_timer_save_context()
106 timer->context.tier = readl_relaxed(timer->irq_ena); in omap_timer_save_context()
107 timer->context.tsicr = in omap_timer_save_context()
108 omap_dm_timer_read_reg(timer, OMAP_TIMER_IF_CTRL_REG); in omap_timer_save_context()
114 struct omap_dm_timer *timer; in omap_timer_context_notifier() local
116 timer = container_of(nb, struct omap_dm_timer, nb); in omap_timer_context_notifier()
120 if ((timer->capability & OMAP_TIMER_ALWON) || in omap_timer_context_notifier()
121 !atomic_read(&timer->enabled)) in omap_timer_context_notifier()
123 omap_timer_save_context(timer); in omap_timer_context_notifier()
127 if ((timer->capability & OMAP_TIMER_ALWON) || in omap_timer_context_notifier()
128 !atomic_read(&timer->enabled)) in omap_timer_context_notifier()
130 omap_timer_restore_context(timer); in omap_timer_context_notifier()
137 static int omap_dm_timer_reset(struct omap_dm_timer *timer) in omap_dm_timer_reset() argument
141 if (timer->revision != 1) in omap_dm_timer_reset()
144 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); in omap_dm_timer_reset()
147 l = __omap_dm_timer_read(timer, in omap_dm_timer_reset()
152 dev_err(&timer->pdev->dev, "Timer failed to reset\n"); in omap_dm_timer_reset()
157 l = __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); in omap_dm_timer_reset()
159 __omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l, 0); in omap_dm_timer_reset()
161 timer->posted = 0; in omap_dm_timer_reset()
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
224 pm_runtime_get_sync(&timer->pdev->dev); in omap_dm_timer_enable()
227 static void omap_dm_timer_disable(struct omap_dm_timer *timer) in omap_dm_timer_disable() argument
229 pm_runtime_put_sync(&timer->pdev->dev); in omap_dm_timer_disable()
232 static int omap_dm_timer_prepare(struct omap_dm_timer *timer) in omap_dm_timer_prepare() argument
240 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { in omap_dm_timer_prepare()
241 timer->fclk = clk_get(&timer->pdev->dev, "fck"); in omap_dm_timer_prepare()
242 if (WARN_ON_ONCE(IS_ERR(timer->fclk))) { in omap_dm_timer_prepare()
243 dev_err(&timer->pdev->dev, ": No fclk handle.\n"); in omap_dm_timer_prepare()
248 omap_dm_timer_enable(timer); in omap_dm_timer_prepare()
250 if (timer->capability & OMAP_TIMER_NEEDS_RESET) { in omap_dm_timer_prepare()
251 rc = omap_dm_timer_reset(timer); in omap_dm_timer_prepare()
253 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
258 __omap_dm_timer_enable_posted(timer); in omap_dm_timer_prepare()
259 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
281 struct omap_dm_timer *timer = NULL, *t; in _omap_dm_timer_request() local
310 timer = t; in _omap_dm_timer_request()
311 timer->reserved = 1; in _omap_dm_timer_request()
325 if (timer) in _omap_dm_timer_request()
326 timer->reserved = 0; in _omap_dm_timer_request()
327 timer = t; in _omap_dm_timer_request()
328 timer->reserved = 1; in _omap_dm_timer_request()
337 timer = t; in _omap_dm_timer_request()
338 timer->reserved = 1; in _omap_dm_timer_request()
344 timer = t; in _omap_dm_timer_request()
345 timer->reserved = 1; in _omap_dm_timer_request()
352 if (timer && omap_dm_timer_prepare(timer)) { in _omap_dm_timer_request()
353 timer->reserved = 0; in _omap_dm_timer_request()
354 timer = NULL; in _omap_dm_timer_request()
357 if (!timer) in _omap_dm_timer_request()
360 return timer; in _omap_dm_timer_request()
409 static int omap_dm_timer_free(struct omap_dm_timer *timer) in omap_dm_timer_free() argument
411 if (unlikely(!timer)) in omap_dm_timer_free()
414 clk_put(timer->fclk); in omap_dm_timer_free()
416 WARN_ON(!timer->reserved); in omap_dm_timer_free()
417 timer->reserved = 0; in omap_dm_timer_free()
421 int omap_dm_timer_get_irq(struct omap_dm_timer *timer) in omap_dm_timer_get_irq() argument
423 if (timer) in omap_dm_timer_get_irq()
424 return timer->irq; in omap_dm_timer_get_irq()
431 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) in omap_dm_timer_get_fclk() argument
443 struct omap_dm_timer *timer = NULL; in omap_dm_timer_modify_idlect_mask() local
452 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timer_modify_idlect_mask()
455 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_modify_idlect_mask()
471 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) in omap_dm_timer_get_fclk() argument
473 if (timer && !IS_ERR(timer->fclk)) in omap_dm_timer_get_fclk()
474 return timer->fclk; in omap_dm_timer_get_fclk()
487 int omap_dm_timer_trigger(struct omap_dm_timer *timer) in omap_dm_timer_trigger() argument
489 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_trigger()
494 omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); in omap_dm_timer_trigger()
498 static int omap_dm_timer_start(struct omap_dm_timer *timer) in omap_dm_timer_start() argument
502 if (unlikely(!timer)) in omap_dm_timer_start()
505 omap_dm_timer_enable(timer); in omap_dm_timer_start()
507 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_start()
510 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_start()
516 static int omap_dm_timer_stop(struct omap_dm_timer *timer) in omap_dm_timer_stop() argument
520 if (unlikely(!timer)) in omap_dm_timer_stop()
523 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) in omap_dm_timer_stop()
524 rate = clk_get_rate(timer->fclk); in omap_dm_timer_stop()
526 __omap_dm_timer_stop(timer, timer->posted, rate); in omap_dm_timer_stop()
528 omap_dm_timer_disable(timer); in omap_dm_timer_stop()
532 static int omap_dm_timer_set_load(struct omap_dm_timer *timer, in omap_dm_timer_set_load() argument
535 if (unlikely(!timer)) in omap_dm_timer_set_load()
538 omap_dm_timer_enable(timer); in omap_dm_timer_set_load()
539 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); in omap_dm_timer_set_load()
541 omap_dm_timer_disable(timer); in omap_dm_timer_set_load()
545 static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, in omap_dm_timer_set_match() argument
550 if (unlikely(!timer)) in omap_dm_timer_set_match()
553 omap_dm_timer_enable(timer); in omap_dm_timer_set_match()
554 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_match()
559 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); in omap_dm_timer_set_match()
560 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_match()
562 omap_dm_timer_disable(timer); in omap_dm_timer_set_match()
566 static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, in omap_dm_timer_set_pwm() argument
571 if (unlikely(!timer)) in omap_dm_timer_set_pwm()
574 omap_dm_timer_enable(timer); in omap_dm_timer_set_pwm()
575 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_pwm()
585 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_pwm()
587 omap_dm_timer_disable(timer); in omap_dm_timer_set_pwm()
591 static int omap_dm_timer_get_pwm_status(struct omap_dm_timer *timer) in omap_dm_timer_get_pwm_status() argument
595 if (unlikely(!timer)) in omap_dm_timer_get_pwm_status()
598 omap_dm_timer_enable(timer); in omap_dm_timer_get_pwm_status()
599 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_get_pwm_status()
600 omap_dm_timer_disable(timer); in omap_dm_timer_get_pwm_status()
605 static int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, in omap_dm_timer_set_prescaler() argument
610 if (unlikely(!timer) || prescaler < -1 || prescaler > 7) in omap_dm_timer_set_prescaler()
613 omap_dm_timer_enable(timer); in omap_dm_timer_set_prescaler()
614 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_prescaler()
620 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_prescaler()
622 omap_dm_timer_disable(timer); in omap_dm_timer_set_prescaler()
626 static int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, in omap_dm_timer_set_int_enable() argument
629 if (unlikely(!timer)) in omap_dm_timer_set_int_enable()
632 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_enable()
633 __omap_dm_timer_int_enable(timer, value); in omap_dm_timer_set_int_enable()
635 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_enable()
646 static int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask) in omap_dm_timer_set_int_disable() argument
650 if (unlikely(!timer)) in omap_dm_timer_set_int_disable()
653 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_disable()
655 if (timer->revision == 1) in omap_dm_timer_set_int_disable()
656 l = readl_relaxed(timer->irq_ena) & ~mask; in omap_dm_timer_set_int_disable()
658 writel_relaxed(l, timer->irq_dis); in omap_dm_timer_set_int_disable()
659 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask; in omap_dm_timer_set_int_disable()
660 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, l); in omap_dm_timer_set_int_disable()
662 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_disable()
666 static unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) in omap_dm_timer_read_status() argument
670 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_read_status()
675 l = readl_relaxed(timer->irq_stat); in omap_dm_timer_read_status()
680 static int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_status() argument
682 if (unlikely(!timer || !atomic_read(&timer->enabled))) in omap_dm_timer_write_status()
685 __omap_dm_timer_write_status(timer, value); in omap_dm_timer_write_status()
690 static unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) in omap_dm_timer_read_counter() argument
692 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_read_counter()
697 return __omap_dm_timer_read_counter(timer, timer->posted); in omap_dm_timer_read_counter()
700 static int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_counter() argument
702 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_write_counter()
707 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); in omap_dm_timer_write_counter()
710 timer->context.tcrr = value; in omap_dm_timer_write_counter()
716 struct omap_dm_timer *timer; in omap_dm_timers_active() local
718 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timers_active()
719 if (!timer->reserved) in omap_dm_timers_active()
722 if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & in omap_dm_timers_active()
732 struct omap_dm_timer *timer = dev_get_drvdata(dev); in omap_dm_timer_runtime_suspend() local
734 atomic_set(&timer->enabled, 0); in omap_dm_timer_runtime_suspend()
736 if (timer->capability & OMAP_TIMER_ALWON || !timer->func_base) in omap_dm_timer_runtime_suspend()
739 omap_timer_save_context(timer); in omap_dm_timer_runtime_suspend()
746 struct omap_dm_timer *timer = dev_get_drvdata(dev); in omap_dm_timer_runtime_resume() local
748 if (!(timer->capability & OMAP_TIMER_ALWON) && timer->func_base) in omap_dm_timer_runtime_resume()
749 omap_timer_restore_context(timer); in omap_dm_timer_runtime_resume()
751 atomic_set(&timer->enabled, 1); in omap_dm_timer_runtime_resume()
773 struct omap_dm_timer *timer; in omap_dm_timer_probe() local
789 timer = devm_kzalloc(dev, sizeof(*timer), GFP_KERNEL); in omap_dm_timer_probe()
790 if (!timer) in omap_dm_timer_probe()
793 timer->irq = platform_get_irq(pdev, 0); in omap_dm_timer_probe()
794 if (timer->irq < 0) in omap_dm_timer_probe()
795 return timer->irq; in omap_dm_timer_probe()
797 timer->fclk = ERR_PTR(-ENODEV); in omap_dm_timer_probe()
798 timer->io_base = devm_platform_ioremap_resource(pdev, 0); in omap_dm_timer_probe()
799 if (IS_ERR(timer->io_base)) in omap_dm_timer_probe()
800 return PTR_ERR(timer->io_base); in omap_dm_timer_probe()
802 platform_set_drvdata(pdev, timer); in omap_dm_timer_probe()
806 timer->capability |= OMAP_TIMER_ALWON; in omap_dm_timer_probe()
808 timer->capability |= OMAP_TIMER_HAS_DSP_IRQ; in omap_dm_timer_probe()
810 timer->capability |= OMAP_TIMER_HAS_PWM; in omap_dm_timer_probe()
812 timer->capability |= OMAP_TIMER_SECURE; in omap_dm_timer_probe()
814 timer->id = pdev->id; in omap_dm_timer_probe()
815 timer->capability = pdata->timer_capability; in omap_dm_timer_probe()
816 timer->reserved = omap_dm_timer_reserved_systimer(timer->id); in omap_dm_timer_probe()
819 if (!(timer->capability & OMAP_TIMER_ALWON)) { in omap_dm_timer_probe()
820 timer->nb.notifier_call = omap_timer_context_notifier; in omap_dm_timer_probe()
821 cpu_pm_register_notifier(&timer->nb); in omap_dm_timer_probe()
825 timer->errata = pdata->timer_errata; in omap_dm_timer_probe()
827 timer->pdev = pdev; in omap_dm_timer_probe()
831 if (!timer->reserved) { in omap_dm_timer_probe()
838 __omap_dm_timer_init_regs(timer); in omap_dm_timer_probe()
844 list_add_tail(&timer->node, &omap_timer_list); in omap_dm_timer_probe()
867 struct omap_dm_timer *timer; in omap_dm_timer_remove() local
872 list_for_each_entry(timer, &omap_timer_list, node) in omap_dm_timer_remove()
873 if (!strcmp(dev_name(&timer->pdev->dev), in omap_dm_timer_remove()
875 if (!(timer->capability & OMAP_TIMER_ALWON)) in omap_dm_timer_remove()
876 cpu_pm_unregister_notifier(&timer->nb); in omap_dm_timer_remove()
877 list_del(&timer->node); in omap_dm_timer_remove()