Lines Matching +full:vf610 +full:- +full:pit
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright 2012-2013 Freescale Semiconductor, Inc.
4 * Copyright 2018,2021-2025 NXP
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
119 * The channels 0 and 1 can be chained to build a 64-bit in pit_clocksource_init()
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()
193 ced->event_handler(ced); 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
205 * The channels 0 and 1 can be chained to build a 64-bit in pit_clockevent_per_cpu_init()
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()
259 * LDVAL trigger = (period / clock period) - 1 in pit_clockevent_starting_cpu()
260 * The pit is a 32-bit down count timer, when the counter value in pit_clockevent_starting_cpu()
263 * minimal LDVAL trigger value + 1, and the max_delta is full 32-bit. 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()
281 return -ENOMEM; in pit_timer_init()
283 ret = -ENXIO; in pit_timer_init()
290 ret = -EINVAL; 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()
358 pit_timer_data = of_device_get_match_data(&pdev->dev); in pit_timer_probe()
360 max_pit_instances = pit_timer_data->max_pit_instances; in pit_timer_probe()
362 return pit_timer_init(pdev->dev.of_node); in pit_timer_probe()
368 { .compatible = "nxp,s32g2-pit", .data = &s32g2_data },
375 .name = "nxp-pit",
382 TIMER_OF_DECLARE(vf610, "fsl,vf610-pit", pit_timer_init);