Lines Matching refs:rps
73 struct oxnas_rps_timer *rps = dev_id; in oxnas_rps_timer_irq() local
75 writel_relaxed(0, rps->clkevt_base + TIMER_CLRINT_REG); in oxnas_rps_timer_irq()
77 rps->clkevent.event_handler(&rps->clkevent); in oxnas_rps_timer_irq()
82 static void oxnas_rps_timer_config(struct oxnas_rps_timer *rps, in oxnas_rps_timer_config() argument
86 uint32_t cfg = rps->timer_prescaler; in oxnas_rps_timer_config()
94 writel_relaxed(period, rps->clkevt_base + TIMER_LOAD_REG); in oxnas_rps_timer_config()
95 writel_relaxed(cfg, rps->clkevt_base + TIMER_CTRL_REG); in oxnas_rps_timer_config()
100 struct oxnas_rps_timer *rps = in oxnas_rps_timer_shutdown() local
103 oxnas_rps_timer_config(rps, 0, 0); in oxnas_rps_timer_shutdown()
110 struct oxnas_rps_timer *rps = in oxnas_rps_timer_set_periodic() local
113 oxnas_rps_timer_config(rps, rps->timer_period, 1); in oxnas_rps_timer_set_periodic()
120 struct oxnas_rps_timer *rps = in oxnas_rps_timer_set_oneshot() local
123 oxnas_rps_timer_config(rps, rps->timer_period, 0); in oxnas_rps_timer_set_oneshot()
131 struct oxnas_rps_timer *rps = in oxnas_rps_timer_next_event() local
134 oxnas_rps_timer_config(rps, delta, 0); in oxnas_rps_timer_next_event()
139 static int __init oxnas_rps_clockevent_init(struct oxnas_rps_timer *rps) in oxnas_rps_clockevent_init() argument
141 ulong clk_rate = clk_get_rate(rps->clk); in oxnas_rps_clockevent_init()
145 rps->timer_prescaler = TIMER_DIV1; in oxnas_rps_clockevent_init()
146 rps->timer_period = DIV_ROUND_UP(clk_rate, HZ); in oxnas_rps_clockevent_init()
149 if (rps->timer_period > TIMER_MAX_VAL) { in oxnas_rps_clockevent_init()
150 rps->timer_prescaler = TIMER_DIV16; in oxnas_rps_clockevent_init()
152 rps->timer_period = DIV_ROUND_UP(timer_rate, HZ); in oxnas_rps_clockevent_init()
154 if (rps->timer_period > TIMER_MAX_VAL) { in oxnas_rps_clockevent_init()
155 rps->timer_prescaler = TIMER_DIV256; in oxnas_rps_clockevent_init()
157 rps->timer_period = DIV_ROUND_UP(timer_rate, HZ); in oxnas_rps_clockevent_init()
160 rps->clkevent.name = "oxnas-rps"; in oxnas_rps_clockevent_init()
161 rps->clkevent.features = CLOCK_EVT_FEAT_PERIODIC | in oxnas_rps_clockevent_init()
164 rps->clkevent.tick_resume = oxnas_rps_timer_shutdown; in oxnas_rps_clockevent_init()
165 rps->clkevent.set_state_shutdown = oxnas_rps_timer_shutdown; in oxnas_rps_clockevent_init()
166 rps->clkevent.set_state_periodic = oxnas_rps_timer_set_periodic; in oxnas_rps_clockevent_init()
167 rps->clkevent.set_state_oneshot = oxnas_rps_timer_set_oneshot; in oxnas_rps_clockevent_init()
168 rps->clkevent.set_next_event = oxnas_rps_timer_next_event; in oxnas_rps_clockevent_init()
169 rps->clkevent.rating = 200; in oxnas_rps_clockevent_init()
170 rps->clkevent.cpumask = cpu_possible_mask; in oxnas_rps_clockevent_init()
171 rps->clkevent.irq = rps->irq; in oxnas_rps_clockevent_init()
172 clockevents_config_and_register(&rps->clkevent, in oxnas_rps_clockevent_init()
179 rps->timer_prescaler, in oxnas_rps_clockevent_init()
180 rps->timer_period); in oxnas_rps_clockevent_init()
194 static int __init oxnas_rps_clocksource_init(struct oxnas_rps_timer *rps) in oxnas_rps_clocksource_init() argument
196 ulong clk_rate = clk_get_rate(rps->clk); in oxnas_rps_clocksource_init()
202 writel_relaxed(TIMER_MAX_VAL, rps->clksrc_base + TIMER_LOAD_REG); in oxnas_rps_clocksource_init()
204 rps->clksrc_base + TIMER_CTRL_REG); in oxnas_rps_clocksource_init()
206 timer_sched_base = rps->clksrc_base + TIMER_CURR_REG; in oxnas_rps_clocksource_init()
225 struct oxnas_rps_timer *rps; in oxnas_rps_timer_init() local
229 rps = kzalloc(sizeof(*rps), GFP_KERNEL); in oxnas_rps_timer_init()
230 if (!rps) in oxnas_rps_timer_init()
233 rps->clk = of_clk_get(np, 0); in oxnas_rps_timer_init()
234 if (IS_ERR(rps->clk)) { in oxnas_rps_timer_init()
235 ret = PTR_ERR(rps->clk); in oxnas_rps_timer_init()
239 ret = clk_prepare_enable(rps->clk); in oxnas_rps_timer_init()
249 rps->irq = irq_of_parse_and_map(np, 0); in oxnas_rps_timer_init()
250 if (rps->irq < 0) { in oxnas_rps_timer_init()
255 rps->clkevt_base = base + TIMER1_REG_OFFSET; in oxnas_rps_timer_init()
256 rps->clksrc_base = base + TIMER2_REG_OFFSET; in oxnas_rps_timer_init()
259 writel_relaxed(0, rps->clkevt_base + TIMER_CTRL_REG); in oxnas_rps_timer_init()
260 writel_relaxed(0, rps->clksrc_base + TIMER_CTRL_REG); in oxnas_rps_timer_init()
261 writel_relaxed(0, rps->clkevt_base + TIMER_LOAD_REG); in oxnas_rps_timer_init()
262 writel_relaxed(0, rps->clksrc_base + TIMER_LOAD_REG); in oxnas_rps_timer_init()
263 writel_relaxed(0, rps->clkevt_base + TIMER_CLRINT_REG); in oxnas_rps_timer_init()
264 writel_relaxed(0, rps->clksrc_base + TIMER_CLRINT_REG); in oxnas_rps_timer_init()
266 ret = request_irq(rps->irq, oxnas_rps_timer_irq, in oxnas_rps_timer_init()
268 "rps-timer", rps); in oxnas_rps_timer_init()
272 ret = oxnas_rps_clocksource_init(rps); in oxnas_rps_timer_init()
276 ret = oxnas_rps_clockevent_init(rps); in oxnas_rps_timer_init()
283 free_irq(rps->irq, rps); in oxnas_rps_timer_init()
287 clk_disable_unprepare(rps->clk); in oxnas_rps_timer_init()
289 clk_put(rps->clk); in oxnas_rps_timer_init()
291 kfree(rps); in oxnas_rps_timer_init()