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