xref: /linux/drivers/clocksource/timer-rzn1.c (revision 435167b4f30191aa7368de68870117bc7218ee8f)
1*435167b4SHerve Codina (Schneider Electric) // SPDX-License-Identifier: GPL-2.0
2*435167b4SHerve Codina (Schneider Electric) /*
3*435167b4SHerve Codina (Schneider Electric)  * RZ/N1 timers driver
4*435167b4SHerve Codina (Schneider Electric)  *
5*435167b4SHerve Codina (Schneider Electric)  * Copyright (C) 2026 Schneider-Electric
6*435167b4SHerve Codina (Schneider Electric)  *
7*435167b4SHerve Codina (Schneider Electric)  * Author: Herve Codina <herve.codina@bootlin.com>
8*435167b4SHerve Codina (Schneider Electric)  */
9*435167b4SHerve Codina (Schneider Electric) 
10*435167b4SHerve Codina (Schneider Electric) #include <linux/bits.h>
11*435167b4SHerve Codina (Schneider Electric) #include <linux/clk.h>
12*435167b4SHerve Codina (Schneider Electric) #include <linux/clockchips.h>
13*435167b4SHerve Codina (Schneider Electric) #include <linux/clocksource.h>
14*435167b4SHerve Codina (Schneider Electric) #include <linux/cpuhotplug.h>
15*435167b4SHerve Codina (Schneider Electric) #include <linux/interrupt.h>
16*435167b4SHerve Codina (Schneider Electric) #include <linux/of.h>
17*435167b4SHerve Codina (Schneider Electric) #include <linux/platform_device.h>
18*435167b4SHerve Codina (Schneider Electric) #include <linux/sched_clock.h>
19*435167b4SHerve Codina (Schneider Electric) 
20*435167b4SHerve Codina (Schneider Electric) /* Per-timer register offsets */
21*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_LOAD_COUNT_REG	0x00
22*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_CURRENT_COUNT_REG	0x04
23*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_CONTROL_REG		0x08
24*435167b4SHerve Codina (Schneider Electric) #define   RZN1_TIMER_CONTROL_INT_UNMASK		BIT(3)
25*435167b4SHerve Codina (Schneider Electric) #define   RZN1_TIMER_CONTROL_ENABLE		BIT(2)
26*435167b4SHerve Codina (Schneider Electric) #define   RZN1_TIMER_CONTROL_AUTORELOAD		BIT(1)
27*435167b4SHerve Codina (Schneider Electric) #define   RZN1_TIMER_CONTROL_PRESCALER_DIV25	BIT(0)
28*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_CLEAR_INT_REG	0x0c
29*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_STATUS_INT0_REG	0x10
30*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_STATUS_INT1_REG	0x14
31*435167b4SHerve Codina (Schneider Electric) 
32*435167b4SHerve Codina (Schneider Electric) /*
33*435167b4SHerve Codina (Schneider Electric)  * 8 timers are available. Among those 8 timers, the first 6 timers are 16-bit
34*435167b4SHerve Codina (Schneider Electric)  * timers and the last two ones are 32-bit timers.
35*435167b4SHerve Codina (Schneider Electric)  */
36*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_BASE_INDEX_16BIT_TIMERS	0
37*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_NB_16BIT_TIMERS		6
38*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_LAST_INDEX_16BIT_TIMERS	(RZN1_TIMER_BASE_INDEX_16BIT_TIMERS + \
39*435167b4SHerve Codina (Schneider Electric) 						 RZN1_TIMER_NB_16BIT_TIMERS - 1)
40*435167b4SHerve Codina (Schneider Electric) 
41*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_BASE_INDEX_32BIT_TIMERS	6
42*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_NB_32BIT_TIMERS		2
43*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_LAST_INDEX_32BIT_TIMERS	(RZN1_TIMER_BASE_INDEX_32BIT_TIMERS + \
44*435167b4SHerve Codina (Schneider Electric) 						 RZN1_TIMER_NB_32BIT_TIMERS - 1)
45*435167b4SHerve Codina (Schneider Electric) 
46*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_IS_16BIT_TIMER(_i) ((_i) < RZN1_TIMER_BASE_INDEX_32BIT_TIMERS)
47*435167b4SHerve Codina (Schneider Electric) 
48*435167b4SHerve Codina (Schneider Electric) /* Total numbers of timers */
49*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_NB_TIMERS	(RZN1_TIMER_NB_16BIT_TIMERS + \
50*435167b4SHerve Codina (Schneider Electric) 				 RZN1_TIMER_NB_32BIT_TIMERS)
51*435167b4SHerve Codina (Schneider Electric) 
52*435167b4SHerve Codina (Schneider Electric) /* Offset of registers related to the timer number _i in the timers regs area */
53*435167b4SHerve Codina (Schneider Electric) #define RZN1_TIMER_REGS_OFFSET(_i) (0x20 * (_i))
54*435167b4SHerve Codina (Schneider Electric) 
55*435167b4SHerve Codina (Schneider Electric) struct rzn1_timer {
56*435167b4SHerve Codina (Schneider Electric) 	void __iomem *base;
57*435167b4SHerve Codina (Schneider Electric) 	unsigned int width;
58*435167b4SHerve Codina (Schneider Electric) 	unsigned long rate;
59*435167b4SHerve Codina (Schneider Electric) 	unsigned long hz_period;
60*435167b4SHerve Codina (Schneider Electric) 	struct clock_event_device ced;
61*435167b4SHerve Codina (Schneider Electric) };
62*435167b4SHerve Codina (Schneider Electric) 
63*435167b4SHerve Codina (Schneider Electric) static int rzn1_timer_config(struct rzn1_timer *timer, u32 period, bool is_periodic)
64*435167b4SHerve Codina (Schneider Electric) {
65*435167b4SHerve Codina (Schneider Electric) 	u32 ctrl;
66*435167b4SHerve Codina (Schneider Electric) 
67*435167b4SHerve Codina (Schneider Electric) 	ctrl = readl(timer->base + RZN1_TIMER_CONTROL_REG);
68*435167b4SHerve Codina (Schneider Electric) 
69*435167b4SHerve Codina (Schneider Electric) 	/* Disable the timer */
70*435167b4SHerve Codina (Schneider Electric) 	writel(ctrl & ~RZN1_TIMER_CONTROL_ENABLE,
71*435167b4SHerve Codina (Schneider Electric) 	       timer->base + RZN1_TIMER_CONTROL_REG);
72*435167b4SHerve Codina (Schneider Electric) 
73*435167b4SHerve Codina (Schneider Electric) 	/* Set the new period */
74*435167b4SHerve Codina (Schneider Electric) 	writel(period, timer->base + RZN1_TIMER_LOAD_COUNT_REG);
75*435167b4SHerve Codina (Schneider Electric) 
76*435167b4SHerve Codina (Schneider Electric) 	/* Prepare the timer mode */
77*435167b4SHerve Codina (Schneider Electric) 	if (is_periodic)
78*435167b4SHerve Codina (Schneider Electric) 		ctrl |= RZN1_TIMER_CONTROL_AUTORELOAD;
79*435167b4SHerve Codina (Schneider Electric) 	else
80*435167b4SHerve Codina (Schneider Electric) 		ctrl &= ~RZN1_TIMER_CONTROL_AUTORELOAD;
81*435167b4SHerve Codina (Schneider Electric) 
82*435167b4SHerve Codina (Schneider Electric) 	/*
83*435167b4SHerve Codina (Schneider Electric) 	 * Enable the timer.
84*435167b4SHerve Codina (Schneider Electric) 	 *
85*435167b4SHerve Codina (Schneider Electric) 	 * This automatically resets the CURRENT_COUNT register.
86*435167b4SHerve Codina (Schneider Electric) 	 */
87*435167b4SHerve Codina (Schneider Electric) 	ctrl |= RZN1_TIMER_CONTROL_ENABLE;
88*435167b4SHerve Codina (Schneider Electric) 	writel(ctrl, timer->base + RZN1_TIMER_CONTROL_REG);
89*435167b4SHerve Codina (Schneider Electric) 
90*435167b4SHerve Codina (Schneider Electric) 	return 0;
91*435167b4SHerve Codina (Schneider Electric) }
92*435167b4SHerve Codina (Schneider Electric) 
93*435167b4SHerve Codina (Schneider Electric) static void rzn1_timer_disable(struct rzn1_timer *timer)
94*435167b4SHerve Codina (Schneider Electric) {
95*435167b4SHerve Codina (Schneider Electric) 	u32 ctrl;
96*435167b4SHerve Codina (Schneider Electric) 
97*435167b4SHerve Codina (Schneider Electric) 	ctrl = readl(timer->base + RZN1_TIMER_CONTROL_REG);
98*435167b4SHerve Codina (Schneider Electric) 	ctrl &= ~RZN1_TIMER_CONTROL_ENABLE;
99*435167b4SHerve Codina (Schneider Electric) 	writel(ctrl, timer->base + RZN1_TIMER_CONTROL_REG);
100*435167b4SHerve Codina (Schneider Electric) }
101*435167b4SHerve Codina (Schneider Electric) 
102*435167b4SHerve Codina (Schneider Electric) static void rzn1_timer_int_enable(struct rzn1_timer *timer)
103*435167b4SHerve Codina (Schneider Electric) {
104*435167b4SHerve Codina (Schneider Electric) 	u32 ctrl;
105*435167b4SHerve Codina (Schneider Electric) 
106*435167b4SHerve Codina (Schneider Electric) 	ctrl = readl(timer->base + RZN1_TIMER_CONTROL_REG);
107*435167b4SHerve Codina (Schneider Electric) 	ctrl |= RZN1_TIMER_CONTROL_INT_UNMASK;
108*435167b4SHerve Codina (Schneider Electric) 	writel(ctrl, timer->base + RZN1_TIMER_CONTROL_REG);
109*435167b4SHerve Codina (Schneider Electric) }
110*435167b4SHerve Codina (Schneider Electric) 
111*435167b4SHerve Codina (Schneider Electric) static irqreturn_t rzn1_timer_interrupt(int irq, void *dev_id)
112*435167b4SHerve Codina (Schneider Electric) {
113*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer = dev_id;
114*435167b4SHerve Codina (Schneider Electric) 
115*435167b4SHerve Codina (Schneider Electric) 	/* Ack the interrupt */
116*435167b4SHerve Codina (Schneider Electric) 	readl(timer->base + RZN1_TIMER_CLEAR_INT_REG);
117*435167b4SHerve Codina (Schneider Electric) 
118*435167b4SHerve Codina (Schneider Electric) 	if (timer->ced.event_handler)
119*435167b4SHerve Codina (Schneider Electric) 		timer->ced.event_handler(&timer->ced);
120*435167b4SHerve Codina (Schneider Electric) 
121*435167b4SHerve Codina (Schneider Electric) 	return IRQ_HANDLED;
122*435167b4SHerve Codina (Schneider Electric) }
123*435167b4SHerve Codina (Schneider Electric) 
124*435167b4SHerve Codina (Schneider Electric) static int rzn1_clkevt_set_next_event(unsigned long cycles,
125*435167b4SHerve Codina (Schneider Electric) 				      struct clock_event_device *evt)
126*435167b4SHerve Codina (Schneider Electric) {
127*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer = container_of(evt, struct rzn1_timer, ced);
128*435167b4SHerve Codina (Schneider Electric) 
129*435167b4SHerve Codina (Schneider Electric) 	return rzn1_timer_config(timer, cycles, false);
130*435167b4SHerve Codina (Schneider Electric) }
131*435167b4SHerve Codina (Schneider Electric) 
132*435167b4SHerve Codina (Schneider Electric) static int rzn1_clkevt_shutdown(struct clock_event_device *evt)
133*435167b4SHerve Codina (Schneider Electric) {
134*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer = container_of(evt, struct rzn1_timer, ced);
135*435167b4SHerve Codina (Schneider Electric) 
136*435167b4SHerve Codina (Schneider Electric) 	rzn1_timer_disable(timer);
137*435167b4SHerve Codina (Schneider Electric) 	return 0;
138*435167b4SHerve Codina (Schneider Electric) }
139*435167b4SHerve Codina (Schneider Electric) 
140*435167b4SHerve Codina (Schneider Electric) static int rzn1_clkevt_set_periodic(struct clock_event_device *evt)
141*435167b4SHerve Codina (Schneider Electric) {
142*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer = container_of(evt, struct rzn1_timer, ced);
143*435167b4SHerve Codina (Schneider Electric) 
144*435167b4SHerve Codina (Schneider Electric) 	rzn1_timer_config(timer, timer->hz_period, true);
145*435167b4SHerve Codina (Schneider Electric) 	return 0;
146*435167b4SHerve Codina (Schneider Electric) }
147*435167b4SHerve Codina (Schneider Electric) 
148*435167b4SHerve Codina (Schneider Electric) /*
149*435167b4SHerve Codina (Schneider Electric)  * This global lock is used to prevent race conditions during global timers
150*435167b4SHerve Codina (Schneider Electric)  * test and set operation in case the driver is using the async probe option.
151*435167b4SHerve Codina (Schneider Electric)  */
152*435167b4SHerve Codina (Schneider Electric) static DEFINE_MUTEX(rzn1_global_timers_lock);
153*435167b4SHerve Codina (Schneider Electric) 
154*435167b4SHerve Codina (Schneider Electric) static int rzn1_timer_instance;
155*435167b4SHerve Codina (Schneider Electric) 
156*435167b4SHerve Codina (Schneider Electric) /* scheduler and clocksource */
157*435167b4SHerve Codina (Schneider Electric) static struct rzn1_timer *rzn1_sched_clock;
158*435167b4SHerve Codina (Schneider Electric) 
159*435167b4SHerve Codina (Schneider Electric) static u64 notrace rzn1_sched_read(void)
160*435167b4SHerve Codina (Schneider Electric) {
161*435167b4SHerve Codina (Schneider Electric) 	return readl_relaxed(rzn1_sched_clock->base + RZN1_TIMER_CURRENT_COUNT_REG);
162*435167b4SHerve Codina (Schneider Electric) }
163*435167b4SHerve Codina (Schneider Electric) 
164*435167b4SHerve Codina (Schneider Electric) static u64 rzn1_clksrc_read(struct clocksource *cs)
165*435167b4SHerve Codina (Schneider Electric) {
166*435167b4SHerve Codina (Schneider Electric) 	return readl_relaxed(rzn1_sched_clock->base + RZN1_TIMER_CURRENT_COUNT_REG);
167*435167b4SHerve Codina (Schneider Electric) }
168*435167b4SHerve Codina (Schneider Electric) 
169*435167b4SHerve Codina (Schneider Electric) static struct clocksource rzn1_clocksource = {
170*435167b4SHerve Codina (Schneider Electric) 	.name = "rzn1_timer_clocksource",
171*435167b4SHerve Codina (Schneider Electric) 	.rating = 200,
172*435167b4SHerve Codina (Schneider Electric) 	.flags = CLOCK_SOURCE_IS_CONTINUOUS,
173*435167b4SHerve Codina (Schneider Electric) 	.read = rzn1_clksrc_read,
174*435167b4SHerve Codina (Schneider Electric) };
175*435167b4SHerve Codina (Schneider Electric) 
176*435167b4SHerve Codina (Schneider Electric) /* Timers table where 16-bit timers will be assigned per-cpu */
177*435167b4SHerve Codina (Schneider Electric) static struct rzn1_timer *rzn1_tab_timers;
178*435167b4SHerve Codina (Schneider Electric) 
179*435167b4SHerve Codina (Schneider Electric) static int rzn1_local_timer_starting_cpu(unsigned int cpu)
180*435167b4SHerve Codina (Schneider Electric) {
181*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer;
182*435167b4SHerve Codina (Schneider Electric) 
183*435167b4SHerve Codina (Schneider Electric) 	/* We assign the first and second 16-bit timer as per-cpu timers. */
184*435167b4SHerve Codina (Schneider Electric) 	if (cpu >= 2)
185*435167b4SHerve Codina (Schneider Electric) 		return 0;
186*435167b4SHerve Codina (Schneider Electric) 
187*435167b4SHerve Codina (Schneider Electric) 	timer = &rzn1_tab_timers[cpu + RZN1_TIMER_BASE_INDEX_16BIT_TIMERS];
188*435167b4SHerve Codina (Schneider Electric) 
189*435167b4SHerve Codina (Schneider Electric) 	timer->ced.cpumask = cpumask_of(cpu);
190*435167b4SHerve Codina (Schneider Electric) 	irq_force_affinity(timer->ced.irq, cpumask_of(cpu));
191*435167b4SHerve Codina (Schneider Electric) 
192*435167b4SHerve Codina (Schneider Electric) 	clockevents_config_and_register(&timer->ced, timer->rate, 1,
193*435167b4SHerve Codina (Schneider Electric) 					GENMASK(timer->width - 1, 0));
194*435167b4SHerve Codina (Schneider Electric) 	/*
195*435167b4SHerve Codina (Schneider Electric) 	 * Time to enable the interrupt even if no interrupt can be fired yet.
196*435167b4SHerve Codina (Schneider Electric) 	 * Indeed, the timer is still globally disabled.
197*435167b4SHerve Codina (Schneider Electric) 	 * It will be enabled when rzn1_timer_config() is called
198*435167b4SHerve Codina (Schneider Electric) 	 */
199*435167b4SHerve Codina (Schneider Electric) 	enable_irq(timer->ced.irq);
200*435167b4SHerve Codina (Schneider Electric) 	return 0;
201*435167b4SHerve Codina (Schneider Electric) }
202*435167b4SHerve Codina (Schneider Electric) 
203*435167b4SHerve Codina (Schneider Electric) static int rzn1_local_timer_dying_cpu(unsigned int cpu)
204*435167b4SHerve Codina (Schneider Electric) {
205*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer;
206*435167b4SHerve Codina (Schneider Electric) 
207*435167b4SHerve Codina (Schneider Electric) 	if (cpu >= 2)
208*435167b4SHerve Codina (Schneider Electric) 		return 0;
209*435167b4SHerve Codina (Schneider Electric) 
210*435167b4SHerve Codina (Schneider Electric) 	timer = &rzn1_tab_timers[cpu + RZN1_TIMER_BASE_INDEX_16BIT_TIMERS];
211*435167b4SHerve Codina (Schneider Electric) 
212*435167b4SHerve Codina (Schneider Electric) 	rzn1_timer_disable(timer);
213*435167b4SHerve Codina (Schneider Electric) 	disable_irq_nosync(timer->ced.irq);
214*435167b4SHerve Codina (Schneider Electric) 	return 0;
215*435167b4SHerve Codina (Schneider Electric) }
216*435167b4SHerve Codina (Schneider Electric) 
217*435167b4SHerve Codina (Schneider Electric) static void rzn1_timer_init(struct rzn1_timer *timer, unsigned int index,
218*435167b4SHerve Codina (Schneider Electric) 			    void __iomem *timers_base, unsigned long clock_rate)
219*435167b4SHerve Codina (Schneider Electric) {
220*435167b4SHerve Codina (Schneider Electric) 	timer->base = timers_base + RZN1_TIMER_REGS_OFFSET(index);
221*435167b4SHerve Codina (Schneider Electric) 
222*435167b4SHerve Codina (Schneider Electric) 	/* Disable the timer */
223*435167b4SHerve Codina (Schneider Electric) 	writel(0, timer->base + RZN1_TIMER_CONTROL_REG);
224*435167b4SHerve Codina (Schneider Electric) 
225*435167b4SHerve Codina (Schneider Electric) 	/* Clear potential interrupts */
226*435167b4SHerve Codina (Schneider Electric) 	readl(timer->base + RZN1_TIMER_CLEAR_INT_REG);
227*435167b4SHerve Codina (Schneider Electric) 
228*435167b4SHerve Codina (Schneider Electric) 	if (RZN1_TIMER_IS_16BIT_TIMER(index)) {
229*435167b4SHerve Codina (Schneider Electric) 		timer->width = 16;
230*435167b4SHerve Codina (Schneider Electric) 		/*
231*435167b4SHerve Codina (Schneider Electric) 		 * Enable pre-scaler for 16-bit timers.
232*435167b4SHerve Codina (Schneider Electric) 		 *
233*435167b4SHerve Codina (Schneider Electric) 		 * Timers are fed by a 25MHz clock. With this pre-scaler (1/25)
234*435167b4SHerve Codina (Schneider Electric) 		 * enabled, the 16-bit timers resolution is 1 microsecond.
235*435167b4SHerve Codina (Schneider Electric) 		 */
236*435167b4SHerve Codina (Schneider Electric) 		writel(RZN1_TIMER_CONTROL_PRESCALER_DIV25,
237*435167b4SHerve Codina (Schneider Electric) 		       timer->base + RZN1_TIMER_CONTROL_REG);
238*435167b4SHerve Codina (Schneider Electric) 		timer->rate = clock_rate / 25;
239*435167b4SHerve Codina (Schneider Electric) 	} else {
240*435167b4SHerve Codina (Schneider Electric) 		timer->width = 32;
241*435167b4SHerve Codina (Schneider Electric) 		timer->rate = clock_rate;
242*435167b4SHerve Codina (Schneider Electric) 	}
243*435167b4SHerve Codina (Schneider Electric) 	timer->hz_period = DIV_ROUND_UP(timer->rate, HZ);
244*435167b4SHerve Codina (Schneider Electric) }
245*435167b4SHerve Codina (Schneider Electric) 
246*435167b4SHerve Codina (Schneider Electric) static void rzn1_timer_clkevt_init_ced(struct rzn1_timer *timer, const char *name,
247*435167b4SHerve Codina (Schneider Electric) 				       int irq)
248*435167b4SHerve Codina (Schneider Electric) {
249*435167b4SHerve Codina (Schneider Electric) 	timer->ced.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
250*435167b4SHerve Codina (Schneider Electric) 	timer->ced.set_next_event = rzn1_clkevt_set_next_event;
251*435167b4SHerve Codina (Schneider Electric) 	timer->ced.set_state_shutdown = rzn1_clkevt_shutdown;
252*435167b4SHerve Codina (Schneider Electric) 	timer->ced.set_state_periodic = rzn1_clkevt_set_periodic;
253*435167b4SHerve Codina (Schneider Electric) 	timer->ced.cpumask = cpu_possible_mask;
254*435167b4SHerve Codina (Schneider Electric) 
255*435167b4SHerve Codina (Schneider Electric) 	/*
256*435167b4SHerve Codina (Schneider Electric) 	 * 32-bit timers are fed with a 25 MHz clock directly derived from the
257*435167b4SHerve Codina (Schneider Electric) 	 * main PLL (1 GHz). The arch timer, ARMv7 CP15 in RZ/N1 SoCs, is fed
258*435167b4SHerve Codina (Schneider Electric) 	 * with to a 6.25 MHz clock.
259*435167b4SHerve Codina (Schneider Electric) 	 *
260*435167b4SHerve Codina (Schneider Electric) 	 * The clock of the RZ/N1 timers block is a stable one and the RZ/N1
261*435167b4SHerve Codina (Schneider Electric) 	 * timers have a higher resolution than the ARM CP15 one.
262*435167b4SHerve Codina (Schneider Electric) 	 *
263*435167b4SHerve Codina (Schneider Electric) 	 * Use a high rating for the 32-bit RZ/N1 timers.
264*435167b4SHerve Codina (Schneider Electric) 	 */
265*435167b4SHerve Codina (Schneider Electric) 	timer->ced.rating = timer->width == 16 ? 200 : 460;
266*435167b4SHerve Codina (Schneider Electric) 	timer->ced.owner = THIS_MODULE;
267*435167b4SHerve Codina (Schneider Electric) 	timer->ced.name = name;
268*435167b4SHerve Codina (Schneider Electric) 	timer->ced.irq = irq;
269*435167b4SHerve Codina (Schneider Electric) }
270*435167b4SHerve Codina (Schneider Electric) 
271*435167b4SHerve Codina (Schneider Electric) static int rzn1_timer_setup_timers(struct platform_device *pdev,
272*435167b4SHerve Codina (Schneider Electric) 				   struct rzn1_timer *tab_timers,
273*435167b4SHerve Codina (Schneider Electric) 				   unsigned int first_timer_index,
274*435167b4SHerve Codina (Schneider Electric) 				   unsigned int last_timer_index,
275*435167b4SHerve Codina (Schneider Electric) 				   void __iomem *base, unsigned long clock_rate)
276*435167b4SHerve Codina (Schneider Electric) {
277*435167b4SHerve Codina (Schneider Electric) 	struct device *dev = &pdev->dev;
278*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer;
279*435167b4SHerve Codina (Schneider Electric) 	unsigned int i;
280*435167b4SHerve Codina (Schneider Electric) 	char *name;
281*435167b4SHerve Codina (Schneider Electric) 	int irq;
282*435167b4SHerve Codina (Schneider Electric) 	int ret;
283*435167b4SHerve Codina (Schneider Electric) 
284*435167b4SHerve Codina (Schneider Electric) 	for (i = first_timer_index; i <= last_timer_index; i++) {
285*435167b4SHerve Codina (Schneider Electric) 		timer = &tab_timers[i];
286*435167b4SHerve Codina (Schneider Electric) 
287*435167b4SHerve Codina (Schneider Electric) 		rzn1_timer_init(timer, i, base, clock_rate);
288*435167b4SHerve Codina (Schneider Electric) 
289*435167b4SHerve Codina (Schneider Electric) 		irq = platform_get_irq(pdev, i);
290*435167b4SHerve Codina (Schneider Electric) 		if (irq < 0)
291*435167b4SHerve Codina (Schneider Electric) 			return irq;
292*435167b4SHerve Codina (Schneider Electric) 
293*435167b4SHerve Codina (Schneider Electric) 		name = devm_kasprintf(dev, GFP_KERNEL, "%s-%u", dev_name(dev), i);
294*435167b4SHerve Codina (Schneider Electric) 		if (!name)
295*435167b4SHerve Codina (Schneider Electric) 			return -ENOMEM;
296*435167b4SHerve Codina (Schneider Electric) 
297*435167b4SHerve Codina (Schneider Electric) 		rzn1_timer_clkevt_init_ced(timer, name, irq);
298*435167b4SHerve Codina (Schneider Electric) 
299*435167b4SHerve Codina (Schneider Electric) 		ret = devm_request_irq(dev, timer->ced.irq, rzn1_timer_interrupt,
300*435167b4SHerve Codina (Schneider Electric) 				       IRQF_TIMER | IRQF_NO_AUTOEN,
301*435167b4SHerve Codina (Schneider Electric) 				       timer->ced.name, timer);
302*435167b4SHerve Codina (Schneider Electric) 		if (ret < 0)
303*435167b4SHerve Codina (Schneider Electric) 			return dev_err_probe(dev, ret, "timer%u: Failed to request IRQ\n", i);
304*435167b4SHerve Codina (Schneider Electric) 
305*435167b4SHerve Codina (Schneider Electric) 		rzn1_timer_int_enable(timer);
306*435167b4SHerve Codina (Schneider Electric) 	}
307*435167b4SHerve Codina (Schneider Electric) 	return 0;
308*435167b4SHerve Codina (Schneider Electric) }
309*435167b4SHerve Codina (Schneider Electric) 
310*435167b4SHerve Codina (Schneider Electric) static void rzn1_timer_register_clkevt(struct rzn1_timer *tab_timers,
311*435167b4SHerve Codina (Schneider Electric) 				       unsigned int first_timer_index,
312*435167b4SHerve Codina (Schneider Electric) 				       unsigned int last_timer_index)
313*435167b4SHerve Codina (Schneider Electric) {
314*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer;
315*435167b4SHerve Codina (Schneider Electric) 	unsigned int i;
316*435167b4SHerve Codina (Schneider Electric) 
317*435167b4SHerve Codina (Schneider Electric) 	for (i = first_timer_index; i <= last_timer_index; i++) {
318*435167b4SHerve Codina (Schneider Electric) 		timer = &tab_timers[i];
319*435167b4SHerve Codina (Schneider Electric) 		clockevents_config_and_register(&timer->ced, timer->rate,
320*435167b4SHerve Codina (Schneider Electric) 						1, GENMASK(timer->width - 1, 0));
321*435167b4SHerve Codina (Schneider Electric) 		/*
322*435167b4SHerve Codina (Schneider Electric) 		 * Time to enable the interrupt even if no interrupt can be
323*435167b4SHerve Codina (Schneider Electric) 		 * fired yet. Indeed, the timer is still globally disabled.
324*435167b4SHerve Codina (Schneider Electric) 		 * It will be enabled when rzn1_timer_config() is called
325*435167b4SHerve Codina (Schneider Electric) 		 */
326*435167b4SHerve Codina (Schneider Electric) 		enable_irq(timer->ced.irq);
327*435167b4SHerve Codina (Schneider Electric) 	}
328*435167b4SHerve Codina (Schneider Electric) }
329*435167b4SHerve Codina (Schneider Electric) 
330*435167b4SHerve Codina (Schneider Electric) static int rzn1_timer_probe_first(struct platform_device *pdev,
331*435167b4SHerve Codina (Schneider Electric) 				  struct rzn1_timer *tab_timers,
332*435167b4SHerve Codina (Schneider Electric) 				  void __iomem *base, unsigned long clock_rate)
333*435167b4SHerve Codina (Schneider Electric) {
334*435167b4SHerve Codina (Schneider Electric) 	struct device *dev = &pdev->dev;
335*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *timer;
336*435167b4SHerve Codina (Schneider Electric) 	int ret;
337*435167b4SHerve Codina (Schneider Electric) 
338*435167b4SHerve Codina (Schneider Electric) 	/*
339*435167b4SHerve Codina (Schneider Electric) 	 * Each timer instance has 6 x 16-bit timers and 2 x 32-bit timers.
340*435167b4SHerve Codina (Schneider Electric) 	 *
341*435167b4SHerve Codina (Schneider Electric) 	 * Probe the first instance. In that case, timers are assigned as
342*435167b4SHerve Codina (Schneider Electric) 	 * follow:
343*435167b4SHerve Codina (Schneider Electric) 	 *   - First and second 16-bit timers: clock events per CPU
344*435167b4SHerve Codina (Schneider Electric) 	 *   - Last (second one) 32-bit timer: clocksource and sched_clock
345*435167b4SHerve Codina (Schneider Electric) 	 *   - Other timers: clock events for all possible CPUs
346*435167b4SHerve Codina (Schneider Electric) 	 *
347*435167b4SHerve Codina (Schneider Electric) 	 * First step, perform all operation that could fail without calling
348*435167b4SHerve Codina (Schneider Electric) 	 * clockevents_config_and_register(), sched_clock_register() nor
349*435167b4SHerve Codina (Schneider Electric) 	 * cpuhp_setup_state(). Those operation don't have unregister nor
350*435167b4SHerve Codina (Schneider Electric) 	 * teardown counterparts and so, once called, we cannot remove the
351*435167b4SHerve Codina (Schneider Electric) 	 * related resource.
352*435167b4SHerve Codina (Schneider Electric) 	 */
353*435167b4SHerve Codina (Schneider Electric) 
354*435167b4SHerve Codina (Schneider Electric) 	/* First step for 16-bit timers and the first 32-bit timers. */
355*435167b4SHerve Codina (Schneider Electric) 	ret = rzn1_timer_setup_timers(pdev, tab_timers,
356*435167b4SHerve Codina (Schneider Electric) 				      RZN1_TIMER_BASE_INDEX_16BIT_TIMERS,
357*435167b4SHerve Codina (Schneider Electric) 				      RZN1_TIMER_BASE_INDEX_32BIT_TIMERS,
358*435167b4SHerve Codina (Schneider Electric) 				      base, clock_rate);
359*435167b4SHerve Codina (Schneider Electric) 	if (ret)
360*435167b4SHerve Codina (Schneider Electric) 		return ret;
361*435167b4SHerve Codina (Schneider Electric) 
362*435167b4SHerve Codina (Schneider Electric) 	/*
363*435167b4SHerve Codina (Schneider Electric) 	 * Second step, almost all operations that can fail have been called.
364*435167b4SHerve Codina (Schneider Electric) 	 * Timers are ready to work. Start with the last operation that can fail,
365*435167b4SHerve Codina (Schneider Electric) 	 * installing and invoking hotplug callbacks
366*435167b4SHerve Codina (Schneider Electric) 	 */
367*435167b4SHerve Codina (Schneider Electric) 	rzn1_tab_timers = tab_timers;
368*435167b4SHerve Codina (Schneider Electric) 	ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
369*435167b4SHerve Codina (Schneider Electric) 				"clockevents/rzn1/global_timer:starting",
370*435167b4SHerve Codina (Schneider Electric) 				rzn1_local_timer_starting_cpu,
371*435167b4SHerve Codina (Schneider Electric) 				rzn1_local_timer_dying_cpu);
372*435167b4SHerve Codina (Schneider Electric) 	if (ret < 0)
373*435167b4SHerve Codina (Schneider Electric) 		return dev_err_probe(dev, ret, "Setup CPU hotplug state failed\n");
374*435167b4SHerve Codina (Schneider Electric) 
375*435167b4SHerve Codina (Schneider Electric) 	/*
376*435167b4SHerve Codina (Schneider Electric) 	 * At this point, no more operations can fail. Perform remaining
377*435167b4SHerve Codina (Schneider Electric) 	 * operations. Starting by handling the last (second one) 32-bit timer
378*435167b4SHerve Codina (Schneider Electric) 	 */
379*435167b4SHerve Codina (Schneider Electric) 	timer = &tab_timers[RZN1_TIMER_LAST_INDEX_32BIT_TIMERS];
380*435167b4SHerve Codina (Schneider Electric) 
381*435167b4SHerve Codina (Schneider Electric) 	rzn1_timer_init(timer, RZN1_TIMER_LAST_INDEX_32BIT_TIMERS, base, clock_rate);
382*435167b4SHerve Codina (Schneider Electric) 	rzn1_timer_config(timer, GENMASK(timer->width - 1, 0), true);
383*435167b4SHerve Codina (Schneider Electric) 
384*435167b4SHerve Codina (Schneider Electric) 	rzn1_sched_clock = timer;
385*435167b4SHerve Codina (Schneider Electric) 
386*435167b4SHerve Codina (Schneider Electric) 	sched_clock_register(rzn1_sched_read, rzn1_sched_clock->width, rzn1_sched_clock->rate);
387*435167b4SHerve Codina (Schneider Electric) 
388*435167b4SHerve Codina (Schneider Electric) 	rzn1_clocksource.mask = CLOCKSOURCE_MASK(rzn1_sched_clock->width);
389*435167b4SHerve Codina (Schneider Electric) 	clocksource_register_hz(&rzn1_clocksource, rzn1_sched_clock->rate);
390*435167b4SHerve Codina (Schneider Electric) 
391*435167b4SHerve Codina (Schneider Electric) 	/*
392*435167b4SHerve Codina (Schneider Electric) 	 * Register clockevents for 16-bit timers (except the first and second
393*435167b4SHerve Codina (Schneider Electric) 	 * ones) and for the first 32-bit timer. The first and second 16-bit
394*435167b4SHerve Codina (Schneider Electric) 	 * timers clockevents are registered by CPU hotplug startup function set
395*435167b4SHerve Codina (Schneider Electric) 	 * previously by the cpuhp_setup_state() call.
396*435167b4SHerve Codina (Schneider Electric) 	 */
397*435167b4SHerve Codina (Schneider Electric) 	rzn1_timer_register_clkevt(tab_timers,
398*435167b4SHerve Codina (Schneider Electric) 				   RZN1_TIMER_BASE_INDEX_16BIT_TIMERS + 2,
399*435167b4SHerve Codina (Schneider Electric) 				   RZN1_TIMER_BASE_INDEX_32BIT_TIMERS);
400*435167b4SHerve Codina (Schneider Electric) 
401*435167b4SHerve Codina (Schneider Electric) 	return 0;
402*435167b4SHerve Codina (Schneider Electric) }
403*435167b4SHerve Codina (Schneider Electric) 
404*435167b4SHerve Codina (Schneider Electric) static int rzn1_timer_probe_other(struct platform_device *pdev,
405*435167b4SHerve Codina (Schneider Electric) 				  struct rzn1_timer *tab_timers,
406*435167b4SHerve Codina (Schneider Electric) 				  void __iomem *base, unsigned long clock_rate)
407*435167b4SHerve Codina (Schneider Electric) {
408*435167b4SHerve Codina (Schneider Electric) 	int ret;
409*435167b4SHerve Codina (Schneider Electric) 
410*435167b4SHerve Codina (Schneider Electric) 	/*
411*435167b4SHerve Codina (Schneider Electric) 	 * Probe other instance(s), i.e. not the first one. In that case,
412*435167b4SHerve Codina (Schneider Electric) 	 * all timers are used as clock events and available for all possible
413*435167b4SHerve Codina (Schneider Electric) 	 * CPUs
414*435167b4SHerve Codina (Schneider Electric) 	 *
415*435167b4SHerve Codina (Schneider Electric) 	 * First step, perform all operation that could fail without calling
416*435167b4SHerve Codina (Schneider Electric) 	 * clockevents_config_and_register(). Unregister counterpart does not
417*435167b4SHerve Codina (Schneider Electric) 	 * exist and so, once called, we cannot remove the related resource.
418*435167b4SHerve Codina (Schneider Electric) 	 */
419*435167b4SHerve Codina (Schneider Electric) 	ret = rzn1_timer_setup_timers(pdev, tab_timers,
420*435167b4SHerve Codina (Schneider Electric) 				      RZN1_TIMER_BASE_INDEX_16BIT_TIMERS,
421*435167b4SHerve Codina (Schneider Electric) 				      RZN1_TIMER_LAST_INDEX_32BIT_TIMERS,
422*435167b4SHerve Codina (Schneider Electric) 				      base, clock_rate);
423*435167b4SHerve Codina (Schneider Electric) 	if (ret)
424*435167b4SHerve Codina (Schneider Electric) 		return ret;
425*435167b4SHerve Codina (Schneider Electric) 
426*435167b4SHerve Codina (Schneider Electric) 	/*
427*435167b4SHerve Codina (Schneider Electric) 	 * Second step, all operation that can fail have been called. We can
428*435167b4SHerve Codina (Schneider Electric) 	 * register our timers.
429*435167b4SHerve Codina (Schneider Electric) 	 */
430*435167b4SHerve Codina (Schneider Electric) 	rzn1_timer_register_clkevt(tab_timers,
431*435167b4SHerve Codina (Schneider Electric) 				   RZN1_TIMER_BASE_INDEX_16BIT_TIMERS,
432*435167b4SHerve Codina (Schneider Electric) 				   RZN1_TIMER_LAST_INDEX_32BIT_TIMERS);
433*435167b4SHerve Codina (Schneider Electric) 	return 0;
434*435167b4SHerve Codina (Schneider Electric) }
435*435167b4SHerve Codina (Schneider Electric) 
436*435167b4SHerve Codina (Schneider Electric) static int rzn1_timer_probe(struct platform_device *pdev)
437*435167b4SHerve Codina (Schneider Electric) {
438*435167b4SHerve Codina (Schneider Electric) 	struct device *dev = &pdev->dev;
439*435167b4SHerve Codina (Schneider Electric) 	struct rzn1_timer *tab_timers;
440*435167b4SHerve Codina (Schneider Electric) 	unsigned long clock_rate;
441*435167b4SHerve Codina (Schneider Electric) 	void __iomem *base;
442*435167b4SHerve Codina (Schneider Electric) 	struct clk *clk;
443*435167b4SHerve Codina (Schneider Electric) 	int ret;
444*435167b4SHerve Codina (Schneider Electric) 
445*435167b4SHerve Codina (Schneider Electric) 	tab_timers = devm_kcalloc(dev, RZN1_TIMER_NB_TIMERS, sizeof(*tab_timers),
446*435167b4SHerve Codina (Schneider Electric) 				  GFP_KERNEL);
447*435167b4SHerve Codina (Schneider Electric) 	if (!tab_timers)
448*435167b4SHerve Codina (Schneider Electric) 		return -ENOMEM;
449*435167b4SHerve Codina (Schneider Electric) 
450*435167b4SHerve Codina (Schneider Electric) 	base = devm_platform_ioremap_resource(pdev, 0);
451*435167b4SHerve Codina (Schneider Electric) 	if (IS_ERR(base))
452*435167b4SHerve Codina (Schneider Electric) 		return PTR_ERR(base);
453*435167b4SHerve Codina (Schneider Electric) 
454*435167b4SHerve Codina (Schneider Electric) 	clk = devm_clk_get_enabled(dev, "pclk");
455*435167b4SHerve Codina (Schneider Electric) 	if (IS_ERR(clk))
456*435167b4SHerve Codina (Schneider Electric) 		return dev_err_probe(dev, PTR_ERR(clk), "Failed to get pclk\n");
457*435167b4SHerve Codina (Schneider Electric) 
458*435167b4SHerve Codina (Schneider Electric) 	clock_rate = clk_get_rate(clk);
459*435167b4SHerve Codina (Schneider Electric) 
460*435167b4SHerve Codina (Schneider Electric) 	scoped_guard(mutex, &rzn1_global_timers_lock) {
461*435167b4SHerve Codina (Schneider Electric) 		ret = !rzn1_timer_instance ?
462*435167b4SHerve Codina (Schneider Electric) 			rzn1_timer_probe_first(pdev, tab_timers, base, clock_rate) :
463*435167b4SHerve Codina (Schneider Electric) 			rzn1_timer_probe_other(pdev, tab_timers, base, clock_rate);
464*435167b4SHerve Codina (Schneider Electric) 		if (!ret)
465*435167b4SHerve Codina (Schneider Electric) 			rzn1_timer_instance++;
466*435167b4SHerve Codina (Schneider Electric) 	}
467*435167b4SHerve Codina (Schneider Electric) 
468*435167b4SHerve Codina (Schneider Electric) 	return ret;
469*435167b4SHerve Codina (Schneider Electric) }
470*435167b4SHerve Codina (Schneider Electric) 
471*435167b4SHerve Codina (Schneider Electric) static const struct of_device_id rzn1_timer_of_match[] = {
472*435167b4SHerve Codina (Schneider Electric) 	{ .compatible = "renesas,rzn1-timer", },
473*435167b4SHerve Codina (Schneider Electric) 	{ /* sentinel */ }
474*435167b4SHerve Codina (Schneider Electric) };
475*435167b4SHerve Codina (Schneider Electric) 
476*435167b4SHerve Codina (Schneider Electric) static struct platform_driver rzn1_timer_driver = {
477*435167b4SHerve Codina (Schneider Electric) 	.driver = {
478*435167b4SHerve Codina (Schneider Electric) 		.name = "rzn1_timer",
479*435167b4SHerve Codina (Schneider Electric) 		.of_match_table = rzn1_timer_of_match,
480*435167b4SHerve Codina (Schneider Electric) 		.suppress_bind_attrs = true,
481*435167b4SHerve Codina (Schneider Electric) 	},
482*435167b4SHerve Codina (Schneider Electric) };
483*435167b4SHerve Codina (Schneider Electric) builtin_platform_driver_probe(rzn1_timer_driver, rzn1_timer_probe);
484