Lines Matching full:timer

3  * 64-bit Periodic Interval Timer driver
37 #define MCHP_PIT64B_TLSBR 0x20 /* Timer LSB Register */
39 #define MCHP_PIT64B_TMSBR 0x24 /* Timer MSB Register */
50 * struct mchp_pit64b_timer - PIT64B timer data structure
65 * @timer: PIT64B timer
69 struct mchp_pit64b_timer timer; member
79 * @timer: PIT64B timer
83 struct mchp_pit64b_timer timer; member
91 /* Base address for clocksource timer. */
93 /* Default cycles for clockevent timer. */
106 * timer value whatever the lapse of time between the accesses. in mchp_pit64b_cnt_read()
116 static inline void mchp_pit64b_reset(struct mchp_pit64b_timer *timer, in mchp_pit64b_reset() argument
124 writel_relaxed(MCHP_PIT64B_CR_SWRST, timer->base + MCHP_PIT64B_CR); in mchp_pit64b_reset()
125 writel_relaxed(mode | timer->mode, timer->base + MCHP_PIT64B_MR); in mchp_pit64b_reset()
126 writel_relaxed(high, timer->base + MCHP_PIT64B_MSB_PR); in mchp_pit64b_reset()
127 writel_relaxed(low, timer->base + MCHP_PIT64B_LSB_PR); in mchp_pit64b_reset()
128 writel_relaxed(irqs, timer->base + MCHP_PIT64B_IER); in mchp_pit64b_reset()
129 writel_relaxed(MCHP_PIT64B_CR_START, timer->base + MCHP_PIT64B_CR); in mchp_pit64b_reset()
132 static void mchp_pit64b_suspend(struct mchp_pit64b_timer *timer) in mchp_pit64b_suspend() argument
134 writel_relaxed(MCHP_PIT64B_CR_SWRST, timer->base + MCHP_PIT64B_CR); in mchp_pit64b_suspend()
135 if (timer->mode & MCHP_PIT64B_MR_SGCLK) in mchp_pit64b_suspend()
136 clk_disable_unprepare(timer->gclk); in mchp_pit64b_suspend()
137 clk_disable_unprepare(timer->pclk); in mchp_pit64b_suspend()
140 static void mchp_pit64b_resume(struct mchp_pit64b_timer *timer) in mchp_pit64b_resume() argument
142 clk_prepare_enable(timer->pclk); in mchp_pit64b_resume()
143 if (timer->mode & MCHP_PIT64B_MR_SGCLK) in mchp_pit64b_resume()
144 clk_prepare_enable(timer->gclk); in mchp_pit64b_resume()
149 struct mchp_pit64b_timer *timer = clksrc_to_mchp_pit64b_timer(cs); in mchp_pit64b_clksrc_suspend() local
151 mchp_pit64b_suspend(timer); in mchp_pit64b_clksrc_suspend()
156 struct mchp_pit64b_timer *timer = clksrc_to_mchp_pit64b_timer(cs); in mchp_pit64b_clksrc_resume() local
158 mchp_pit64b_resume(timer); in mchp_pit64b_clksrc_resume()
159 mchp_pit64b_reset(timer, ULLONG_MAX, MCHP_PIT64B_MR_CONT, 0); in mchp_pit64b_clksrc_resume()
174 struct mchp_pit64b_timer *timer = clkevt_to_mchp_pit64b_timer(cedev); in mchp_pit64b_clkevt_shutdown() local
177 mchp_pit64b_suspend(timer); in mchp_pit64b_clkevt_shutdown()
184 struct mchp_pit64b_timer *timer = clkevt_to_mchp_pit64b_timer(cedev); in mchp_pit64b_clkevt_set_periodic() local
187 mchp_pit64b_resume(timer); in mchp_pit64b_clkevt_set_periodic()
189 mchp_pit64b_reset(timer, mchp_pit64b_ce_cycles, MCHP_PIT64B_MR_CONT, in mchp_pit64b_clkevt_set_periodic()
197 struct mchp_pit64b_timer *timer = clkevt_to_mchp_pit64b_timer(cedev); in mchp_pit64b_clkevt_set_oneshot() local
200 mchp_pit64b_resume(timer); in mchp_pit64b_clkevt_set_oneshot()
202 mchp_pit64b_reset(timer, mchp_pit64b_ce_cycles, MCHP_PIT64B_MR_ONE_SHOT, in mchp_pit64b_clkevt_set_oneshot()
211 struct mchp_pit64b_timer *timer = clkevt_to_mchp_pit64b_timer(cedev); in mchp_pit64b_clkevt_set_next_event() local
213 mchp_pit64b_reset(timer, evt, MCHP_PIT64B_MR_ONE_SHOT, in mchp_pit64b_clkevt_set_next_event()
224 readl_relaxed(irq_data->timer.base + MCHP_PIT64B_ISR); in mchp_pit64b_interrupt()
250 * @timer: pointer to pit64b timer to init
251 * @max_rate: maximum rate that timer's clock could use
253 * PIT64B timer may be fed by gclk or pclk. When gclk is used its rate has to
261 * then the function falls back on using PCLK as clock source for PIT64B timer
271 * | | | | MUX |--->| Divider |->|timer| |
283 static int __init mchp_pit64b_init_mode(struct mchp_pit64b_timer *timer, in mchp_pit64b_init_mode() argument
290 pclk_rate = clk_get_rate(timer->pclk); in mchp_pit64b_init_mode()
294 timer->mode = 0; in mchp_pit64b_init_mode()
297 gclk_round = clk_round_rate(timer->gclk, max_rate); in mchp_pit64b_init_mode()
309 timer->mode |= MCHP_PIT64B_MR_SGCLK; in mchp_pit64b_init_mode()
310 clk_set_rate(timer->gclk, gclk_round); in mchp_pit64b_init_mode()
324 timer->mode |= MCHP_PIT64B_MR_SGCLK; in mchp_pit64b_init_mode()
325 clk_set_rate(timer->gclk, gclk_round); in mchp_pit64b_init_mode()
329 timer->mode |= MCHP_PIT64B_PRES_TO_MODE(best_pres); in mchp_pit64b_init_mode()
332 timer->mode & MCHP_PIT64B_MR_SGCLK ? "gclk" : "pclk", best_pres, in mchp_pit64b_init_mode()
333 timer->mode & MCHP_PIT64B_MR_SGCLK ? in mchp_pit64b_init_mode()
339 static int __init mchp_pit64b_init_clksrc(struct mchp_pit64b_timer *timer, in mchp_pit64b_init_clksrc() argument
349 mchp_pit64b_resume(timer); in mchp_pit64b_init_clksrc()
350 mchp_pit64b_reset(timer, ULLONG_MAX, MCHP_PIT64B_MR_CONT, 0); in mchp_pit64b_init_clksrc()
352 mchp_pit64b_cs_base = timer->base; in mchp_pit64b_init_clksrc()
354 cs->timer.base = timer->base; in mchp_pit64b_init_clksrc()
355 cs->timer.pclk = timer->pclk; in mchp_pit64b_init_clksrc()
356 cs->timer.gclk = timer->gclk; in mchp_pit64b_init_clksrc()
357 cs->timer.mode = timer->mode; in mchp_pit64b_init_clksrc()
370 /* Stop timer. */ in mchp_pit64b_init_clksrc()
371 mchp_pit64b_suspend(timer); in mchp_pit64b_init_clksrc()
382 static int __init mchp_pit64b_init_clkevt(struct mchp_pit64b_timer *timer, in mchp_pit64b_init_clkevt() argument
394 ce->timer.base = timer->base; in mchp_pit64b_init_clkevt()
395 ce->timer.pclk = timer->pclk; in mchp_pit64b_init_clkevt()
396 ce->timer.gclk = timer->gclk; in mchp_pit64b_init_clkevt()
397 ce->timer.mode = timer->mode; in mchp_pit64b_init_clkevt()
424 struct mchp_pit64b_timer timer; in mchp_pit64b_dt_init_timer() local
430 timer.pclk = of_clk_get_by_name(node, "pclk"); in mchp_pit64b_dt_init_timer()
431 if (IS_ERR(timer.pclk)) in mchp_pit64b_dt_init_timer()
432 return PTR_ERR(timer.pclk); in mchp_pit64b_dt_init_timer()
434 timer.gclk = of_clk_get_by_name(node, "gclk"); in mchp_pit64b_dt_init_timer()
435 if (IS_ERR(timer.gclk)) in mchp_pit64b_dt_init_timer()
436 return PTR_ERR(timer.gclk); in mchp_pit64b_dt_init_timer()
438 timer.base = of_iomap(node, 0); in mchp_pit64b_dt_init_timer()
439 if (!timer.base) in mchp_pit64b_dt_init_timer()
451 ret = mchp_pit64b_init_mode(&timer, MCHP_PIT64B_DEF_FREQ); in mchp_pit64b_dt_init_timer()
455 if (timer.mode & MCHP_PIT64B_MR_SGCLK) in mchp_pit64b_dt_init_timer()
456 clk_rate = clk_get_rate(timer.gclk); in mchp_pit64b_dt_init_timer()
458 clk_rate = clk_get_rate(timer.pclk); in mchp_pit64b_dt_init_timer()
459 clk_rate = clk_rate / (MCHP_PIT64B_MODE_TO_PRES(timer.mode) + 1); in mchp_pit64b_dt_init_timer()
462 ret = mchp_pit64b_init_clkevt(&timer, clk_rate, irq); in mchp_pit64b_dt_init_timer()
464 ret = mchp_pit64b_init_clksrc(&timer, clk_rate); in mchp_pit64b_dt_init_timer()
474 iounmap(timer.base); in mchp_pit64b_dt_init_timer()