2 * Copyright (C) Maxime Coquelin 2015
3 * Author: Maxime Coquelin <mcoquelin.stm32@gmail.com>
4 * License terms: GNU General Public License (GPL), version 2
6 * Inspired by time-efm32.c from Uwe Kleine-Koenig
9 #include <linux/kernel.h>
10 #include <linux/clocksource.h>
11 #include <linux/clockchips.h>
12 #include <linux/irq.h>
13 #include <linux/interrupt.h>
15 #include <linux/of_address.h>
16 #include <linux/of_irq.h>
17 #include <linux/clk.h>
18 #include <linux/reset.h>
19 #include <linux/slab.h>
30 #define TIM_CR1_CEN BIT(0)
31 #define TIM_CR1_OPM BIT(3)
32 #define TIM_CR1_ARPE BIT(7)
34 #define TIM_DIER_UIE BIT(0)
36 #define TIM_SR_UIF BIT(0)
38 #define TIM_EGR_UG BIT(0)
40 static int stm32_clock_event_shutdown(struct clock_event_device *clkevt)
42 struct timer_of *to = to_timer_of(clkevt);
44 writel_relaxed(0, timer_of_base(to) + TIM_CR1);
49 static int stm32_clock_event_set_periodic(struct clock_event_device *clkevt)
51 struct timer_of *to = to_timer_of(clkevt);
53 writel_relaxed(timer_of_period(to), timer_of_base(to) + TIM_ARR);
54 writel_relaxed(TIM_CR1_ARPE | TIM_CR1_CEN, timer_of_base(to) + TIM_CR1);
59 static int stm32_clock_event_set_next_event(unsigned long evt,
60 struct clock_event_device *clkevt)
62 struct timer_of *to = to_timer_of(clkevt);
64 writel_relaxed(evt, timer_of_base(to) + TIM_ARR);
65 writel_relaxed(TIM_CR1_ARPE | TIM_CR1_OPM | TIM_CR1_CEN,
66 timer_of_base(to) + TIM_CR1);
71 static irqreturn_t stm32_clock_event_handler(int irq, void *dev_id)
73 struct clock_event_device *clkevt = (struct clock_event_device *)dev_id;
74 struct timer_of *to = to_timer_of(clkevt);
76 writel_relaxed(0, timer_of_base(to) + TIM_SR);
78 clkevt->event_handler(clkevt);
83 static void __init stm32_clockevent_init(struct timer_of *to)
85 unsigned long max_delta;
88 to->clkevt.name = "stm32_clockevent";
89 to->clkevt.features = CLOCK_EVT_FEAT_PERIODIC;
90 to->clkevt.set_state_shutdown = stm32_clock_event_shutdown;
91 to->clkevt.set_state_periodic = stm32_clock_event_set_periodic;
92 to->clkevt.set_state_oneshot = stm32_clock_event_shutdown;
93 to->clkevt.tick_resume = stm32_clock_event_shutdown;
94 to->clkevt.set_next_event = stm32_clock_event_set_next_event;
96 /* Detect whether the timer is 16 or 32 bits */
97 writel_relaxed(~0U, timer_of_base(to) + TIM_ARR);
98 max_delta = readl_relaxed(timer_of_base(to) + TIM_ARR);
99 if (max_delta == ~0U) {
101 to->clkevt.rating = 250;
104 to->clkevt.rating = 100;
106 writel_relaxed(0, timer_of_base(to) + TIM_ARR);
108 writel_relaxed(prescaler - 1, timer_of_base(to) + TIM_PSC);
109 writel_relaxed(TIM_EGR_UG, timer_of_base(to) + TIM_EGR);
110 writel_relaxed(0, timer_of_base(to) + TIM_SR);
111 writel_relaxed(TIM_DIER_UIE, timer_of_base(to) + TIM_DIER);
113 /* Adjust rate and period given the prescaler value */
114 to->of_clk.rate = DIV_ROUND_CLOSEST(to->of_clk.rate, prescaler);
115 to->of_clk.period = DIV_ROUND_UP(to->of_clk.rate, HZ);
117 clockevents_config_and_register(&to->clkevt,
118 timer_of_rate(to), 0x1, max_delta);
120 pr_info("%pOF: STM32 clockevent driver initialized (%d bits)\n",
121 to->np, max_delta == UINT_MAX ? 32 : 16);
124 static int __init stm32_timer_init(struct device_node *node)
126 struct reset_control *rstc;
130 to = kzalloc(sizeof(*to), GFP_KERNEL);
134 to->flags = TIMER_OF_IRQ | TIMER_OF_CLOCK | TIMER_OF_BASE;
135 to->of_irq.handler = stm32_clock_event_handler;
137 ret = timer_of_init(node, to);
141 rstc = of_reset_control_get(node, NULL);
143 reset_control_assert(rstc);
144 reset_control_deassert(rstc);
147 stm32_clockevent_init(to);
154 TIMER_OF_DECLARE(stm32, "st,stm32-timer", stm32_timer_init);