Lines Matching full:pit

16  * Each pit takes 0x10 Bytes register space
98 static inline void pit_timer_irqack(struct pit_timer *pit) in pit_timer_irqack() argument
100 writel(PITTFLG_TIF, PITTFLG(pit->clkevt_base)); in pit_timer_irqack()
110 struct pit_timer *pit = cs_to_pit(cs); in pit_timer_clocksource_read() local
112 return (u64)~readl(PITCVAL(pit->clksrc_base)); in pit_timer_clocksource_read()
115 static int pit_clocksource_init(struct pit_timer *pit, const char *name, in pit_clocksource_init() argument
123 pit->clksrc_base = base + PIT_CH(2); in pit_clocksource_init()
124 pit->cs.name = name; in pit_clocksource_init()
125 pit->cs.rating = 300; in pit_clocksource_init()
126 pit->cs.read = pit_timer_clocksource_read; in pit_clocksource_init()
127 pit->cs.mask = CLOCKSOURCE_MASK(32); in pit_clocksource_init()
128 pit->cs.flags = CLOCK_SOURCE_IS_CONTINUOUS; in pit_clocksource_init()
131 pit_timer_disable(pit->clksrc_base); in pit_clocksource_init()
132 pit_timer_set_counter(pit->clksrc_base, ~0); in pit_clocksource_init()
133 pit_timer_enable(pit->clksrc_base, 0); in pit_clocksource_init()
135 sched_clock_base = pit->clksrc_base + PITCVAL_OFFSET; in pit_clocksource_init()
138 return clocksource_register_hz(&pit->cs, rate); in pit_clocksource_init()
143 struct pit_timer *pit = ced_to_pit(ced); in pit_set_next_event() local
149 * and the PITLAVAL should be set to delta minus one according to pit in pit_set_next_event()
152 pit_timer_disable(pit->clkevt_base); in pit_set_next_event()
153 pit_timer_set_counter(pit->clkevt_base, delta - 1); in pit_set_next_event()
154 pit_timer_enable(pit->clkevt_base, true); in pit_set_next_event()
161 struct pit_timer *pit = ced_to_pit(ced); in pit_shutdown() local
163 pit_timer_disable(pit->clkevt_base); in pit_shutdown()
170 struct pit_timer *pit = ced_to_pit(ced); in pit_set_periodic() local
172 pit_set_next_event(pit->rate / HZ, ced); in pit_set_periodic()
180 struct pit_timer *pit = ced_to_pit(ced); in pit_timer_interrupt() local
182 pit_timer_irqack(pit); in pit_timer_interrupt()
185 * pit hardware doesn't support oneshot, it will generate an interrupt in pit_timer_interrupt()
191 pit_timer_disable(pit->clkevt_base); in pit_timer_interrupt()
198 static int pit_clockevent_per_cpu_init(struct pit_timer *pit, const char *name, in pit_clockevent_per_cpu_init() argument
209 pit->clkevt_base = base + PIT_CH(3); in pit_clockevent_per_cpu_init()
210 pit->rate = rate; in pit_clockevent_per_cpu_init()
212 pit_timer_disable(pit->clkevt_base); in pit_clockevent_per_cpu_init()
214 pit_timer_irqack(pit); in pit_clockevent_per_cpu_init()
217 name, &pit->ced); in pit_clockevent_per_cpu_init()
221 pit->ced.cpumask = cpumask_of(cpu); in pit_clockevent_per_cpu_init()
222 pit->ced.irq = irq; in pit_clockevent_per_cpu_init()
224 pit->ced.name = name; in pit_clockevent_per_cpu_init()
225 pit->ced.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; in pit_clockevent_per_cpu_init()
226 pit->ced.set_state_shutdown = pit_shutdown; in pit_clockevent_per_cpu_init()
227 pit->ced.set_state_periodic = pit_set_periodic; in pit_clockevent_per_cpu_init()
228 pit->ced.set_next_event = pit_set_next_event; in pit_clockevent_per_cpu_init()
229 pit->ced.rating = 300; in pit_clockevent_per_cpu_init()
231 per_cpu(pit_timers, cpu) = pit; in pit_clockevent_per_cpu_init()
236 static void pit_clockevent_per_cpu_exit(struct pit_timer *pit, unsigned int cpu) in pit_clockevent_per_cpu_exit() argument
238 pit_timer_disable(pit->clkevt_base); in pit_clockevent_per_cpu_exit()
239 free_irq(pit->ced.irq, &pit->ced); in pit_clockevent_per_cpu_exit()
245 struct pit_timer *pit = per_cpu(pit_timers, cpu); in pit_clockevent_starting_cpu() local
248 if (!pit) in pit_clockevent_starting_cpu()
251 ret = irq_force_affinity(pit->ced.irq, cpumask_of(cpu)); in pit_clockevent_starting_cpu()
253 pit_clockevent_per_cpu_exit(pit, cpu); in pit_clockevent_starting_cpu()
260 * The pit is a 32-bit down count timer, when the counter value in pit_clockevent_starting_cpu()
265 clockevents_config_and_register(&pit->ced, pit->rate, 2, 0xffffffff); in pit_clockevent_starting_cpu()
272 struct pit_timer *pit; in pit_timer_init() local
279 pit = kzalloc(sizeof(*pit), GFP_KERNEL); in pit_timer_init()
280 if (!pit) in pit_timer_init()
311 ret = pit_clocksource_init(pit, name, timer_base, clk_rate); in pit_timer_init()
317 ret = pit_clockevent_per_cpu_init(pit, name, timer_base, clk_rate, irq, pit_instances); in pit_timer_init()
323 /* enable the pit module */ in pit_timer_init()
329 ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "PIT timer:starting", in pit_timer_init()
338 clocksource_unregister(&pit->cs); in pit_timer_init()
349 kfree(pit); in pit_timer_init()
368 { .compatible = "nxp,s32g2-pit", .data = &s32g2_data },
375 .name = "nxp-pit",
382 TIMER_OF_DECLARE(vf610, "fsl,vf610-pit", pit_timer_init);