• Home
  • Raw
  • Download

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(timer, OMAP_TIMER_OCP_CFG_OFFSET, in omap_timer_restore_context()
82 timer->context.ocp_cfg, 0); in omap_timer_restore_context()
84 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, in omap_timer_restore_context()
85 timer->context.twer); in omap_timer_restore_context()
86 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, in omap_timer_restore_context()
87 timer->context.tcrr); in omap_timer_restore_context()
88 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, in omap_timer_restore_context()
89 timer->context.tldr); in omap_timer_restore_context()
90 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, in omap_timer_restore_context()
91 timer->context.tmar); in omap_timer_restore_context()
92 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, in omap_timer_restore_context()
93 timer->context.tsicr); in omap_timer_restore_context()
94 writel_relaxed(timer->context.tier, timer->irq_ena); in omap_timer_restore_context()
95 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, in omap_timer_restore_context()
96 timer->context.tclr); in omap_timer_restore_context()
99 static void omap_timer_save_context(struct omap_dm_timer *timer) in omap_timer_save_context() argument
101 timer->context.ocp_cfg = in omap_timer_save_context()
102 __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); in omap_timer_save_context()
104 timer->context.tclr = in omap_timer_save_context()
105 omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_timer_save_context()
106 timer->context.twer = in omap_timer_save_context()
107 omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG); in omap_timer_save_context()
108 timer->context.tldr = in omap_timer_save_context()
109 omap_dm_timer_read_reg(timer, OMAP_TIMER_LOAD_REG); in omap_timer_save_context()
110 timer->context.tmar = in omap_timer_save_context()
111 omap_dm_timer_read_reg(timer, OMAP_TIMER_MATCH_REG); in omap_timer_save_context()
112 timer->context.tier = readl_relaxed(timer->irq_ena); in omap_timer_save_context()
113 timer->context.tsicr = in omap_timer_save_context()
114 omap_dm_timer_read_reg(timer, OMAP_TIMER_IF_CTRL_REG); in omap_timer_save_context()
120 struct omap_dm_timer *timer; in omap_timer_context_notifier() local
122 timer = container_of(nb, struct omap_dm_timer, nb); in omap_timer_context_notifier()
126 if ((timer->capability & OMAP_TIMER_ALWON) || in omap_timer_context_notifier()
127 !atomic_read(&timer->enabled)) in omap_timer_context_notifier()
129 omap_timer_save_context(timer); in omap_timer_context_notifier()
133 if ((timer->capability & OMAP_TIMER_ALWON) || in omap_timer_context_notifier()
134 !atomic_read(&timer->enabled)) in omap_timer_context_notifier()
136 omap_timer_restore_context(timer); in omap_timer_context_notifier()
143 static int omap_dm_timer_reset(struct omap_dm_timer *timer) in omap_dm_timer_reset() argument
147 if (timer->revision != 1) in omap_dm_timer_reset()
150 omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); in omap_dm_timer_reset()
153 l = __omap_dm_timer_read(timer, in omap_dm_timer_reset()
158 dev_err(&timer->pdev->dev, "Timer failed to reset\n"); in omap_dm_timer_reset()
163 l = __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0); in omap_dm_timer_reset()
165 __omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l, 0); in omap_dm_timer_reset()
167 timer->posted = 0; in omap_dm_timer_reset()
172 static int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) in omap_dm_timer_set_source() argument
179 if (unlikely(!timer) || IS_ERR(timer->fclk)) in omap_dm_timer_set_source()
196 pdata = timer->pdev->dev.platform_data; in omap_dm_timer_set_source()
204 return pdata->set_timer_src(timer->pdev, source); in omap_dm_timer_set_source()
208 if (clk_hw_get_num_parents(__clk_get_hw(timer->fclk)) < 2) in omap_dm_timer_set_source()
212 parent = clk_get(&timer->pdev->dev, parent_name); in omap_dm_timer_set_source()
218 ret = clk_set_parent(timer->fclk, parent); in omap_dm_timer_set_source()
228 static void omap_dm_timer_enable(struct omap_dm_timer *timer) in omap_dm_timer_enable() argument
230 pm_runtime_get_sync(&timer->pdev->dev); in omap_dm_timer_enable()
233 static void omap_dm_timer_disable(struct omap_dm_timer *timer) in omap_dm_timer_disable() argument
235 pm_runtime_put_sync(&timer->pdev->dev); in omap_dm_timer_disable()
238 static int omap_dm_timer_prepare(struct omap_dm_timer *timer) in omap_dm_timer_prepare() argument
246 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { in omap_dm_timer_prepare()
247 timer->fclk = clk_get(&timer->pdev->dev, "fck"); in omap_dm_timer_prepare()
248 if (WARN_ON_ONCE(IS_ERR(timer->fclk))) { in omap_dm_timer_prepare()
249 dev_err(&timer->pdev->dev, ": No fclk handle.\n"); in omap_dm_timer_prepare()
254 omap_dm_timer_enable(timer); in omap_dm_timer_prepare()
256 if (timer->capability & OMAP_TIMER_NEEDS_RESET) { in omap_dm_timer_prepare()
257 rc = omap_dm_timer_reset(timer); in omap_dm_timer_prepare()
259 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
264 __omap_dm_timer_enable_posted(timer); in omap_dm_timer_prepare()
265 omap_dm_timer_disable(timer); in omap_dm_timer_prepare()
287 struct omap_dm_timer *timer = NULL, *t; in _omap_dm_timer_request() local
316 timer = t; in _omap_dm_timer_request()
317 timer->reserved = 1; in _omap_dm_timer_request()
331 if (timer) in _omap_dm_timer_request()
332 timer->reserved = 0; in _omap_dm_timer_request()
333 timer = t; in _omap_dm_timer_request()
334 timer->reserved = 1; in _omap_dm_timer_request()
343 timer = t; in _omap_dm_timer_request()
344 timer->reserved = 1; in _omap_dm_timer_request()
350 timer = t; in _omap_dm_timer_request()
351 timer->reserved = 1; in _omap_dm_timer_request()
358 if (timer && omap_dm_timer_prepare(timer)) { in _omap_dm_timer_request()
359 timer->reserved = 0; in _omap_dm_timer_request()
360 timer = NULL; in _omap_dm_timer_request()
363 if (!timer) in _omap_dm_timer_request()
366 return timer; in _omap_dm_timer_request()
415 static int omap_dm_timer_free(struct omap_dm_timer *timer) in omap_dm_timer_free() argument
417 if (unlikely(!timer)) in omap_dm_timer_free()
420 clk_put(timer->fclk); in omap_dm_timer_free()
422 WARN_ON(!timer->reserved); in omap_dm_timer_free()
423 timer->reserved = 0; in omap_dm_timer_free()
427 int omap_dm_timer_get_irq(struct omap_dm_timer *timer) in omap_dm_timer_get_irq() argument
429 if (timer) in omap_dm_timer_get_irq()
430 return timer->irq; in omap_dm_timer_get_irq()
437 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) in omap_dm_timer_get_fclk() argument
449 struct omap_dm_timer *timer = NULL; in omap_dm_timer_modify_idlect_mask() local
458 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timer_modify_idlect_mask()
461 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_modify_idlect_mask()
477 static struct clk *omap_dm_timer_get_fclk(struct omap_dm_timer *timer) in omap_dm_timer_get_fclk() argument
479 if (timer && !IS_ERR(timer->fclk)) in omap_dm_timer_get_fclk()
480 return timer->fclk; in omap_dm_timer_get_fclk()
493 int omap_dm_timer_trigger(struct omap_dm_timer *timer) in omap_dm_timer_trigger() argument
495 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_trigger()
500 omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); in omap_dm_timer_trigger()
504 static int omap_dm_timer_start(struct omap_dm_timer *timer) in omap_dm_timer_start() argument
508 if (unlikely(!timer)) in omap_dm_timer_start()
511 omap_dm_timer_enable(timer); in omap_dm_timer_start()
513 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_start()
516 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_start()
522 static int omap_dm_timer_stop(struct omap_dm_timer *timer) in omap_dm_timer_stop() argument
526 if (unlikely(!timer)) in omap_dm_timer_stop()
529 if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) in omap_dm_timer_stop()
530 rate = clk_get_rate(timer->fclk); in omap_dm_timer_stop()
532 __omap_dm_timer_stop(timer, timer->posted, rate); in omap_dm_timer_stop()
534 omap_dm_timer_disable(timer); in omap_dm_timer_stop()
538 static int omap_dm_timer_set_load(struct omap_dm_timer *timer, in omap_dm_timer_set_load() argument
541 if (unlikely(!timer)) in omap_dm_timer_set_load()
544 omap_dm_timer_enable(timer); in omap_dm_timer_set_load()
545 omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); in omap_dm_timer_set_load()
547 omap_dm_timer_disable(timer); in omap_dm_timer_set_load()
551 static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, in omap_dm_timer_set_match() argument
556 if (unlikely(!timer)) in omap_dm_timer_set_match()
559 omap_dm_timer_enable(timer); in omap_dm_timer_set_match()
560 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_match()
565 omap_dm_timer_write_reg(timer, OMAP_TIMER_MATCH_REG, match); in omap_dm_timer_set_match()
566 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_match()
568 omap_dm_timer_disable(timer); in omap_dm_timer_set_match()
572 static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, in omap_dm_timer_set_pwm() argument
577 if (unlikely(!timer)) in omap_dm_timer_set_pwm()
580 omap_dm_timer_enable(timer); in omap_dm_timer_set_pwm()
581 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_pwm()
591 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_pwm()
593 omap_dm_timer_disable(timer); in omap_dm_timer_set_pwm()
597 static int omap_dm_timer_get_pwm_status(struct omap_dm_timer *timer) in omap_dm_timer_get_pwm_status() argument
601 if (unlikely(!timer)) in omap_dm_timer_get_pwm_status()
604 omap_dm_timer_enable(timer); in omap_dm_timer_get_pwm_status()
605 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_get_pwm_status()
606 omap_dm_timer_disable(timer); in omap_dm_timer_get_pwm_status()
611 static int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, in omap_dm_timer_set_prescaler() argument
616 if (unlikely(!timer) || prescaler < -1 || prescaler > 7) in omap_dm_timer_set_prescaler()
619 omap_dm_timer_enable(timer); in omap_dm_timer_set_prescaler()
620 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_prescaler()
626 omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_prescaler()
628 omap_dm_timer_disable(timer); in omap_dm_timer_set_prescaler()
632 static int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, in omap_dm_timer_set_int_enable() argument
635 if (unlikely(!timer)) in omap_dm_timer_set_int_enable()
638 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_enable()
639 __omap_dm_timer_int_enable(timer, value); in omap_dm_timer_set_int_enable()
641 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_enable()
652 static int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask) in omap_dm_timer_set_int_disable() argument
656 if (unlikely(!timer)) in omap_dm_timer_set_int_disable()
659 omap_dm_timer_enable(timer); in omap_dm_timer_set_int_disable()
661 if (timer->revision == 1) in omap_dm_timer_set_int_disable()
662 l = readl_relaxed(timer->irq_ena) & ~mask; in omap_dm_timer_set_int_disable()
664 writel_relaxed(l, timer->irq_dis); in omap_dm_timer_set_int_disable()
665 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask; in omap_dm_timer_set_int_disable()
666 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, l); in omap_dm_timer_set_int_disable()
668 omap_dm_timer_disable(timer); in omap_dm_timer_set_int_disable()
672 static unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) in omap_dm_timer_read_status() argument
676 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_read_status()
681 l = readl_relaxed(timer->irq_stat); in omap_dm_timer_read_status()
686 static int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_status() argument
688 if (unlikely(!timer || !atomic_read(&timer->enabled))) in omap_dm_timer_write_status()
691 __omap_dm_timer_write_status(timer, value); in omap_dm_timer_write_status()
696 static unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer) in omap_dm_timer_read_counter() argument
698 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_read_counter()
703 return __omap_dm_timer_read_counter(timer, timer->posted); in omap_dm_timer_read_counter()
706 static int omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value) in omap_dm_timer_write_counter() argument
708 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_write_counter()
713 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, value); in omap_dm_timer_write_counter()
716 timer->context.tcrr = value; in omap_dm_timer_write_counter()
722 struct omap_dm_timer *timer; in omap_dm_timers_active() local
724 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timers_active()
725 if (!timer->reserved) in omap_dm_timers_active()
728 if (omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG) & in omap_dm_timers_active()
738 struct omap_dm_timer *timer = dev_get_drvdata(dev); in omap_dm_timer_runtime_suspend() local
740 atomic_set(&timer->enabled, 0); in omap_dm_timer_runtime_suspend()
742 if (timer->capability & OMAP_TIMER_ALWON || !timer->func_base) in omap_dm_timer_runtime_suspend()
745 omap_timer_save_context(timer); in omap_dm_timer_runtime_suspend()
752 struct omap_dm_timer *timer = dev_get_drvdata(dev); in omap_dm_timer_runtime_resume() local
754 if (!(timer->capability & OMAP_TIMER_ALWON) && timer->func_base) in omap_dm_timer_runtime_resume()
755 omap_timer_restore_context(timer); in omap_dm_timer_runtime_resume()
757 atomic_set(&timer->enabled, 1); in omap_dm_timer_runtime_resume()
779 struct omap_dm_timer *timer; in omap_dm_timer_probe() local
795 timer = devm_kzalloc(dev, sizeof(*timer), GFP_KERNEL); in omap_dm_timer_probe()
796 if (!timer) in omap_dm_timer_probe()
799 timer->irq = platform_get_irq(pdev, 0); in omap_dm_timer_probe()
800 if (timer->irq < 0) in omap_dm_timer_probe()
801 return timer->irq; in omap_dm_timer_probe()
803 timer->fclk = ERR_PTR(-ENODEV); in omap_dm_timer_probe()
804 timer->io_base = devm_platform_ioremap_resource(pdev, 0); in omap_dm_timer_probe()
805 if (IS_ERR(timer->io_base)) in omap_dm_timer_probe()
806 return PTR_ERR(timer->io_base); in omap_dm_timer_probe()
808 platform_set_drvdata(pdev, timer); in omap_dm_timer_probe()
812 timer->capability |= OMAP_TIMER_ALWON; in omap_dm_timer_probe()
814 timer->capability |= OMAP_TIMER_HAS_DSP_IRQ; in omap_dm_timer_probe()
816 timer->capability |= OMAP_TIMER_HAS_PWM; in omap_dm_timer_probe()
818 timer->capability |= OMAP_TIMER_SECURE; in omap_dm_timer_probe()
820 timer->id = pdev->id; in omap_dm_timer_probe()
821 timer->capability = pdata->timer_capability; in omap_dm_timer_probe()
822 timer->reserved = omap_dm_timer_reserved_systimer(timer->id); in omap_dm_timer_probe()
825 if (!(timer->capability & OMAP_TIMER_ALWON)) { in omap_dm_timer_probe()
826 timer->nb.notifier_call = omap_timer_context_notifier; in omap_dm_timer_probe()
827 cpu_pm_register_notifier(&timer->nb); in omap_dm_timer_probe()
831 timer->errata = pdata->timer_errata; in omap_dm_timer_probe()
833 timer->pdev = pdev; in omap_dm_timer_probe()
837 if (!timer->reserved) { in omap_dm_timer_probe()
844 __omap_dm_timer_init_regs(timer); in omap_dm_timer_probe()
850 list_add_tail(&timer->node, &omap_timer_list); in omap_dm_timer_probe()
873 struct omap_dm_timer *timer; in omap_dm_timer_remove() local
878 list_for_each_entry(timer, &omap_timer_list, node) in omap_dm_timer_remove()
879 if (!strcmp(dev_name(&timer->pdev->dev), in omap_dm_timer_remove()
881 if (!(timer->capability & OMAP_TIMER_ALWON)) in omap_dm_timer_remove()
882 cpu_pm_unregister_notifier(&timer->nb); in omap_dm_timer_remove()
883 list_del(&timer->node); in omap_dm_timer_remove()