Lines Matching refs:timer

167 static inline u32 dmtimer_read(struct dmtimer *timer, u32 reg)  in dmtimer_read()  argument
175 if (wp && timer->posted) in dmtimer_read()
176 while (readl_relaxed(timer->pend) & wp) in dmtimer_read()
179 return readl_relaxed(timer->func_base + offset); in dmtimer_read()
192 static inline void dmtimer_write(struct dmtimer *timer, u32 reg, u32 val) in dmtimer_write() argument
200 if (wp && timer->posted) in dmtimer_write()
201 while (readl_relaxed(timer->pend) & wp) in dmtimer_write()
204 writel_relaxed(val, timer->func_base + offset); in dmtimer_write()
207 static inline void __omap_dm_timer_init_regs(struct dmtimer *timer) in __omap_dm_timer_init_regs() argument
212 tidr = readl_relaxed(timer->io_base); in __omap_dm_timer_init_regs()
214 timer->revision = 1; in __omap_dm_timer_init_regs()
215 timer->irq_stat = OMAP_TIMER_V1_STAT_OFFSET; in __omap_dm_timer_init_regs()
216 timer->irq_ena = OMAP_TIMER_V1_INT_EN_OFFSET; in __omap_dm_timer_init_regs()
217 timer->irq_dis = OMAP_TIMER_V1_INT_EN_OFFSET; in __omap_dm_timer_init_regs()
218 timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET; in __omap_dm_timer_init_regs()
219 timer->func_base = timer->io_base; in __omap_dm_timer_init_regs()
221 timer->revision = 2; in __omap_dm_timer_init_regs()
222 timer->irq_stat = OMAP_TIMER_V2_IRQSTATUS - OMAP_TIMER_V2_FUNC_OFFSET; in __omap_dm_timer_init_regs()
223 timer->irq_ena = OMAP_TIMER_V2_IRQENABLE_SET - OMAP_TIMER_V2_FUNC_OFFSET; in __omap_dm_timer_init_regs()
224 timer->irq_dis = OMAP_TIMER_V2_IRQENABLE_CLR - OMAP_TIMER_V2_FUNC_OFFSET; in __omap_dm_timer_init_regs()
225 timer->pend = timer->io_base + in __omap_dm_timer_init_regs()
228 timer->func_base = timer->io_base + OMAP_TIMER_V2_FUNC_OFFSET; in __omap_dm_timer_init_regs()
242 static inline void __omap_dm_timer_enable_posted(struct dmtimer *timer) in __omap_dm_timer_enable_posted() argument
244 if (timer->posted) in __omap_dm_timer_enable_posted()
247 if (timer->errata & OMAP_TIMER_ERRATA_I103_I767) { in __omap_dm_timer_enable_posted()
248 timer->posted = OMAP_TIMER_NONPOSTED; in __omap_dm_timer_enable_posted()
249 dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0); in __omap_dm_timer_enable_posted()
253 dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, OMAP_TIMER_CTRL_POSTED); in __omap_dm_timer_enable_posted()
254 timer->context.tsicr = OMAP_TIMER_CTRL_POSTED; in __omap_dm_timer_enable_posted()
255 timer->posted = OMAP_TIMER_POSTED; in __omap_dm_timer_enable_posted()
258 static inline void __omap_dm_timer_stop(struct dmtimer *timer) in __omap_dm_timer_stop() argument
262 l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in __omap_dm_timer_stop()
265 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l); in __omap_dm_timer_stop()
268 dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in __omap_dm_timer_stop()
273 udelay(3500000 / timer->fclk_rate + 1); in __omap_dm_timer_stop()
278 dmtimer_write(timer, timer->irq_stat, OMAP_TIMER_INT_OVERFLOW); in __omap_dm_timer_stop()
281 static inline void __omap_dm_timer_int_enable(struct dmtimer *timer, in __omap_dm_timer_int_enable() argument
284 dmtimer_write(timer, timer->irq_ena, value); in __omap_dm_timer_int_enable()
285 dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, value); in __omap_dm_timer_int_enable()
289 __omap_dm_timer_read_counter(struct dmtimer *timer) in __omap_dm_timer_read_counter() argument
291 return dmtimer_read(timer, OMAP_TIMER_COUNTER_REG); in __omap_dm_timer_read_counter()
294 static inline void __omap_dm_timer_write_status(struct dmtimer *timer, in __omap_dm_timer_write_status() argument
297 dmtimer_write(timer, timer->irq_stat, value); in __omap_dm_timer_write_status()
300 static void omap_timer_restore_context(struct dmtimer *timer) in omap_timer_restore_context() argument
302 dmtimer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, timer->context.ocp_cfg); in omap_timer_restore_context()
304 dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, timer->context.twer); in omap_timer_restore_context()
305 dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, timer->context.tcrr); in omap_timer_restore_context()
306 dmtimer_write(timer, OMAP_TIMER_LOAD_REG, timer->context.tldr); in omap_timer_restore_context()
307 dmtimer_write(timer, OMAP_TIMER_MATCH_REG, timer->context.tmar); in omap_timer_restore_context()
308 dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, timer->context.tsicr); in omap_timer_restore_context()
309 dmtimer_write(timer, timer->irq_ena, timer->context.tier); in omap_timer_restore_context()
310 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, timer->context.tclr); in omap_timer_restore_context()
313 static void omap_timer_save_context(struct dmtimer *timer) in omap_timer_save_context() argument
315 timer->context.ocp_cfg = dmtimer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET); in omap_timer_save_context()
317 timer->context.tclr = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in omap_timer_save_context()
318 timer->context.twer = dmtimer_read(timer, OMAP_TIMER_WAKEUP_EN_REG); in omap_timer_save_context()
319 timer->context.tldr = dmtimer_read(timer, OMAP_TIMER_LOAD_REG); in omap_timer_save_context()
320 timer->context.tmar = dmtimer_read(timer, OMAP_TIMER_MATCH_REG); in omap_timer_save_context()
321 timer->context.tier = dmtimer_read(timer, timer->irq_ena); in omap_timer_save_context()
322 timer->context.tsicr = dmtimer_read(timer, OMAP_TIMER_IF_CTRL_REG); in omap_timer_save_context()
328 struct dmtimer *timer; in omap_timer_context_notifier() local
330 timer = container_of(nb, struct dmtimer, nb); in omap_timer_context_notifier()
334 if ((timer->capability & OMAP_TIMER_ALWON) || in omap_timer_context_notifier()
335 !atomic_read(&timer->enabled)) in omap_timer_context_notifier()
337 omap_timer_save_context(timer); in omap_timer_context_notifier()
342 if ((timer->capability & OMAP_TIMER_ALWON) || in omap_timer_context_notifier()
343 !atomic_read(&timer->enabled)) in omap_timer_context_notifier()
345 omap_timer_restore_context(timer); in omap_timer_context_notifier()
356 struct dmtimer *timer = container_of(nb, struct dmtimer, fclk_nb); in omap_timer_fclk_notifier() local
360 timer->fclk_rate = clk_data->new_rate; in omap_timer_fclk_notifier()
367 static int omap_dm_timer_reset(struct dmtimer *timer) in omap_dm_timer_reset() argument
371 if (timer->revision != 1) in omap_dm_timer_reset()
374 dmtimer_write(timer, OMAP_TIMER_IF_CTRL_REG, 0x06); in omap_dm_timer_reset()
377 l = dmtimer_read(timer, OMAP_TIMER_V1_SYS_STAT_OFFSET); in omap_dm_timer_reset()
381 dev_err(&timer->pdev->dev, "Timer failed to reset\n"); in omap_dm_timer_reset()
386 l = dmtimer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET); in omap_dm_timer_reset()
388 dmtimer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l); in omap_dm_timer_reset()
390 timer->posted = 0; in omap_dm_timer_reset()
415 struct dmtimer *timer; in omap_dm_timer_set_source() local
417 timer = to_dmtimer(cookie); in omap_dm_timer_set_source()
418 if (unlikely(!timer) || IS_ERR(timer->fclk)) in omap_dm_timer_set_source()
435 pdata = timer->pdev->dev.platform_data; in omap_dm_timer_set_source()
442 if (timer->omap1 && pdata && pdata->set_timer_src) in omap_dm_timer_set_source()
443 return pdata->set_timer_src(timer->pdev, source); in omap_dm_timer_set_source()
447 if (clk_hw_get_num_parents(__clk_get_hw(timer->fclk)) < 2) in omap_dm_timer_set_source()
451 parent = clk_get(&timer->pdev->dev, parent_name); in omap_dm_timer_set_source()
457 ret = clk_set_parent(timer->fclk, parent); in omap_dm_timer_set_source()
469 struct dmtimer *timer = to_dmtimer(cookie); in omap_dm_timer_enable() local
470 struct device *dev = &timer->pdev->dev; in omap_dm_timer_enable()
480 struct dmtimer *timer = to_dmtimer(cookie); in omap_dm_timer_disable() local
481 struct device *dev = &timer->pdev->dev; in omap_dm_timer_disable()
486 static int omap_dm_timer_prepare(struct dmtimer *timer) in omap_dm_timer_prepare() argument
488 struct device *dev = &timer->pdev->dev; in omap_dm_timer_prepare()
495 if (timer->capability & OMAP_TIMER_NEEDS_RESET) { in omap_dm_timer_prepare()
496 rc = omap_dm_timer_reset(timer); in omap_dm_timer_prepare()
503 __omap_dm_timer_enable_posted(timer); in omap_dm_timer_prepare()
516 struct dmtimer *timer = NULL, *t; in _omap_dm_timer_request() local
545 timer = t; in _omap_dm_timer_request()
546 timer->reserved = 1; in _omap_dm_timer_request()
560 if (timer) in _omap_dm_timer_request()
561 timer->reserved = 0; in _omap_dm_timer_request()
562 timer = t; in _omap_dm_timer_request()
563 timer->reserved = 1; in _omap_dm_timer_request()
572 timer = t; in _omap_dm_timer_request()
573 timer->reserved = 1; in _omap_dm_timer_request()
579 timer = t; in _omap_dm_timer_request()
580 timer->reserved = 1; in _omap_dm_timer_request()
587 if (timer && omap_dm_timer_prepare(timer)) { in _omap_dm_timer_request()
588 timer->reserved = 0; in _omap_dm_timer_request()
589 timer = NULL; in _omap_dm_timer_request()
592 if (!timer) in _omap_dm_timer_request()
595 return timer; in _omap_dm_timer_request()
600 struct dmtimer *timer; in omap_dm_timer_request() local
602 timer = _omap_dm_timer_request(REQUEST_ANY, NULL); in omap_dm_timer_request()
603 if (!timer) in omap_dm_timer_request()
606 return &timer->cookie; in omap_dm_timer_request()
611 struct dmtimer *timer; in omap_dm_timer_request_specific() local
620 timer = _omap_dm_timer_request(REQUEST_BY_ID, &id); in omap_dm_timer_request_specific()
621 if (!timer) in omap_dm_timer_request_specific()
624 return &timer->cookie; in omap_dm_timer_request_specific()
636 struct dmtimer *timer; in omap_dm_timer_request_by_node() local
641 timer = _omap_dm_timer_request(REQUEST_BY_NODE, np); in omap_dm_timer_request_by_node()
642 if (!timer) in omap_dm_timer_request_by_node()
645 return &timer->cookie; in omap_dm_timer_request_by_node()
650 struct dmtimer *timer; in omap_dm_timer_free() local
654 timer = to_dmtimer(cookie); in omap_dm_timer_free()
655 if (unlikely(!timer)) in omap_dm_timer_free()
658 WARN_ON(!timer->reserved); in omap_dm_timer_free()
659 timer->reserved = 0; in omap_dm_timer_free()
661 dev = &timer->pdev->dev; in omap_dm_timer_free()
667 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, 0); in omap_dm_timer_free()
676 struct dmtimer *timer = to_dmtimer(cookie); in omap_dm_timer_get_irq() local
677 if (timer) in omap_dm_timer_get_irq()
678 return timer->irq; in omap_dm_timer_get_irq()
697 struct dmtimer *timer = NULL; in omap_dm_timer_modify_idlect_mask() local
706 list_for_each_entry(timer, &omap_timer_list, node) { in omap_dm_timer_modify_idlect_mask()
709 l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_modify_idlect_mask()
727 struct dmtimer *timer = to_dmtimer(cookie); in omap_dm_timer_get_fclk() local
729 if (timer && !IS_ERR(timer->fclk)) in omap_dm_timer_get_fclk()
730 return timer->fclk; in omap_dm_timer_get_fclk()
745 struct dmtimer *timer; in omap_dm_timer_start() local
750 timer = to_dmtimer(cookie); in omap_dm_timer_start()
751 if (unlikely(!timer)) in omap_dm_timer_start()
754 dev = &timer->pdev->dev; in omap_dm_timer_start()
760 l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_start()
763 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_start()
771 struct dmtimer *timer; in omap_dm_timer_stop() local
774 timer = to_dmtimer(cookie); in omap_dm_timer_stop()
775 if (unlikely(!timer)) in omap_dm_timer_stop()
778 dev = &timer->pdev->dev; in omap_dm_timer_stop()
780 __omap_dm_timer_stop(timer); in omap_dm_timer_stop()
790 struct dmtimer *timer; in omap_dm_timer_set_load() local
794 timer = to_dmtimer(cookie); in omap_dm_timer_set_load()
795 if (unlikely(!timer)) in omap_dm_timer_set_load()
798 dev = &timer->pdev->dev; in omap_dm_timer_set_load()
803 dmtimer_write(timer, OMAP_TIMER_LOAD_REG, load); in omap_dm_timer_set_load()
813 struct dmtimer *timer; in omap_dm_timer_set_match() local
818 timer = to_dmtimer(cookie); in omap_dm_timer_set_match()
819 if (unlikely(!timer)) in omap_dm_timer_set_match()
822 dev = &timer->pdev->dev; in omap_dm_timer_set_match()
827 l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_match()
832 dmtimer_write(timer, OMAP_TIMER_MATCH_REG, match); in omap_dm_timer_set_match()
833 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_match()
843 struct dmtimer *timer; in omap_dm_timer_set_pwm() local
848 timer = to_dmtimer(cookie); in omap_dm_timer_set_pwm()
849 if (unlikely(!timer)) in omap_dm_timer_set_pwm()
852 dev = &timer->pdev->dev; in omap_dm_timer_set_pwm()
857 l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_pwm()
867 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_pwm()
876 struct dmtimer *timer; in omap_dm_timer_get_pwm_status() local
881 timer = to_dmtimer(cookie); in omap_dm_timer_get_pwm_status()
882 if (unlikely(!timer)) in omap_dm_timer_get_pwm_status()
885 dev = &timer->pdev->dev; in omap_dm_timer_get_pwm_status()
890 l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_get_pwm_status()
900 struct dmtimer *timer; in omap_dm_timer_set_prescaler() local
905 timer = to_dmtimer(cookie); in omap_dm_timer_set_prescaler()
906 if (unlikely(!timer) || prescaler < -1 || prescaler > 7) in omap_dm_timer_set_prescaler()
909 dev = &timer->pdev->dev; in omap_dm_timer_set_prescaler()
914 l = dmtimer_read(timer, OMAP_TIMER_CTRL_REG); in omap_dm_timer_set_prescaler()
920 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, l); in omap_dm_timer_set_prescaler()
930 struct dmtimer *timer; in omap_dm_timer_set_int_enable() local
934 timer = to_dmtimer(cookie); in omap_dm_timer_set_int_enable()
935 if (unlikely(!timer)) in omap_dm_timer_set_int_enable()
938 dev = &timer->pdev->dev; in omap_dm_timer_set_int_enable()
943 __omap_dm_timer_int_enable(timer, value); in omap_dm_timer_set_int_enable()
959 struct dmtimer *timer; in omap_dm_timer_set_int_disable() local
964 timer = to_dmtimer(cookie); in omap_dm_timer_set_int_disable()
965 if (unlikely(!timer)) in omap_dm_timer_set_int_disable()
968 dev = &timer->pdev->dev; in omap_dm_timer_set_int_disable()
973 if (timer->revision == 1) in omap_dm_timer_set_int_disable()
974 l = dmtimer_read(timer, timer->irq_ena) & ~mask; in omap_dm_timer_set_int_disable()
976 dmtimer_write(timer, timer->irq_dis, l); in omap_dm_timer_set_int_disable()
977 l = dmtimer_read(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask; in omap_dm_timer_set_int_disable()
978 dmtimer_write(timer, OMAP_TIMER_WAKEUP_EN_REG, l); in omap_dm_timer_set_int_disable()
987 struct dmtimer *timer; in omap_dm_timer_read_status() local
990 timer = to_dmtimer(cookie); in omap_dm_timer_read_status()
991 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_read_status()
996 l = dmtimer_read(timer, timer->irq_stat); in omap_dm_timer_read_status()
1003 struct dmtimer *timer; in omap_dm_timer_write_status() local
1005 timer = to_dmtimer(cookie); in omap_dm_timer_write_status()
1006 if (unlikely(!timer || !atomic_read(&timer->enabled))) in omap_dm_timer_write_status()
1009 __omap_dm_timer_write_status(timer, value); in omap_dm_timer_write_status()
1016 struct dmtimer *timer; in omap_dm_timer_read_counter() local
1018 timer = to_dmtimer(cookie); in omap_dm_timer_read_counter()
1019 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_read_counter()
1024 return __omap_dm_timer_read_counter(timer); in omap_dm_timer_read_counter()
1029 struct dmtimer *timer; in omap_dm_timer_write_counter() local
1031 timer = to_dmtimer(cookie); in omap_dm_timer_write_counter()
1032 if (unlikely(!timer || !atomic_read(&timer->enabled))) { in omap_dm_timer_write_counter()
1037 dmtimer_write(timer, OMAP_TIMER_COUNTER_REG, value); in omap_dm_timer_write_counter()
1040 timer->context.tcrr = value; in omap_dm_timer_write_counter()
1046 struct dmtimer *timer = dev_get_drvdata(dev); in omap_dm_timer_runtime_suspend() local
1048 atomic_set(&timer->enabled, 0); in omap_dm_timer_runtime_suspend()
1050 if (timer->capability & OMAP_TIMER_ALWON || !timer->func_base) in omap_dm_timer_runtime_suspend()
1053 omap_timer_save_context(timer); in omap_dm_timer_runtime_suspend()
1060 struct dmtimer *timer = dev_get_drvdata(dev); in omap_dm_timer_runtime_resume() local
1062 if (!(timer->capability & OMAP_TIMER_ALWON) && timer->func_base) in omap_dm_timer_runtime_resume()
1063 omap_timer_restore_context(timer); in omap_dm_timer_runtime_resume()
1065 atomic_set(&timer->enabled, 1); in omap_dm_timer_runtime_resume()
1087 struct dmtimer *timer; in omap_dm_timer_probe() local
1103 timer = devm_kzalloc(dev, sizeof(*timer), GFP_KERNEL); in omap_dm_timer_probe()
1104 if (!timer) in omap_dm_timer_probe()
1107 timer->irq = platform_get_irq(pdev, 0); in omap_dm_timer_probe()
1108 if (timer->irq < 0) in omap_dm_timer_probe()
1109 return timer->irq; in omap_dm_timer_probe()
1111 timer->io_base = devm_platform_ioremap_resource(pdev, 0); in omap_dm_timer_probe()
1112 if (IS_ERR(timer->io_base)) in omap_dm_timer_probe()
1113 return PTR_ERR(timer->io_base); in omap_dm_timer_probe()
1115 platform_set_drvdata(pdev, timer); in omap_dm_timer_probe()
1119 timer->capability |= OMAP_TIMER_ALWON; in omap_dm_timer_probe()
1121 timer->capability |= OMAP_TIMER_HAS_DSP_IRQ; in omap_dm_timer_probe()
1123 timer->capability |= OMAP_TIMER_HAS_PWM; in omap_dm_timer_probe()
1125 timer->capability |= OMAP_TIMER_SECURE; in omap_dm_timer_probe()
1127 timer->id = pdev->id; in omap_dm_timer_probe()
1128 timer->capability = pdata->timer_capability; in omap_dm_timer_probe()
1129 timer->reserved = omap_dm_timer_reserved_systimer(timer->id); in omap_dm_timer_probe()
1132 timer->omap1 = timer->capability & OMAP_TIMER_NEEDS_RESET; in omap_dm_timer_probe()
1135 if (!timer->omap1) { in omap_dm_timer_probe()
1136 timer->fclk = devm_clk_get(dev, "fck"); in omap_dm_timer_probe()
1137 if (IS_ERR(timer->fclk)) in omap_dm_timer_probe()
1138 return PTR_ERR(timer->fclk); in omap_dm_timer_probe()
1140 timer->fclk_nb.notifier_call = omap_timer_fclk_notifier; in omap_dm_timer_probe()
1141 ret = devm_clk_notifier_register(dev, timer->fclk, in omap_dm_timer_probe()
1142 &timer->fclk_nb); in omap_dm_timer_probe()
1146 timer->fclk_rate = clk_get_rate(timer->fclk); in omap_dm_timer_probe()
1148 timer->fclk = ERR_PTR(-ENODEV); in omap_dm_timer_probe()
1151 if (!(timer->capability & OMAP_TIMER_ALWON)) { in omap_dm_timer_probe()
1152 timer->nb.notifier_call = omap_timer_context_notifier; in omap_dm_timer_probe()
1153 cpu_pm_register_notifier(&timer->nb); in omap_dm_timer_probe()
1156 timer->errata = pdata->timer_errata; in omap_dm_timer_probe()
1158 timer->pdev = pdev; in omap_dm_timer_probe()
1162 if (!timer->reserved) { in omap_dm_timer_probe()
1169 __omap_dm_timer_init_regs(timer); in omap_dm_timer_probe()
1172 dmtimer_write(timer, OMAP_TIMER_CTRL_REG, 0); in omap_dm_timer_probe()
1179 list_add_tail(&timer->node, &omap_timer_list); in omap_dm_timer_probe()
1201 struct dmtimer *timer; in omap_dm_timer_remove() local
1206 list_for_each_entry(timer, &omap_timer_list, node) in omap_dm_timer_remove()
1207 if (!strcmp(dev_name(&timer->pdev->dev), in omap_dm_timer_remove()
1209 if (!(timer->capability & OMAP_TIMER_ALWON)) in omap_dm_timer_remove()
1210 cpu_pm_unregister_notifier(&timer->nb); in omap_dm_timer_remove()
1211 list_del(&timer->node); in omap_dm_timer_remove()