Lines Matching +full:apb +full:- +full:base
1 // SPDX-License-Identifier: GPL-2.0-only
8 * Support for the Synopsys DesignWare APB Timers.
51 return readl(timer->base + offs); in apbt_readl()
57 writel(val, timer->base + offs); in apbt_writel()
62 return readl_relaxed(timer->base + offs); in apbt_readl_relaxed()
68 writel_relaxed(val, timer->base + offs); in apbt_writel_relaxed()
81 if (!evt->event_handler) { in dw_apb_clockevent_irq()
86 if (dw_ced->eoi) in dw_apb_clockevent_irq()
87 dw_ced->eoi(&dw_ced->timer); in dw_apb_clockevent_irq()
89 evt->event_handler(evt); in dw_apb_clockevent_irq()
108 cpumask_first(evt->cpumask)); in apbt_shutdown()
110 ctrl = apbt_readl(&dw_ced->timer, APBTMR_N_CONTROL); in apbt_shutdown()
112 apbt_writel(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_shutdown()
122 cpumask_first(evt->cpumask)); in apbt_set_oneshot()
124 ctrl = apbt_readl(&dw_ced->timer, APBTMR_N_CONTROL); in apbt_set_oneshot()
128 * the next event, therefore emulate the one-shot mode. in apbt_set_oneshot()
133 apbt_writel(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_set_oneshot()
135 apbt_writel(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_set_oneshot()
138 * DW APB p. 46, load counter with all 1s before starting free in apbt_set_oneshot()
141 apbt_writel(&dw_ced->timer, ~0, APBTMR_N_LOAD_COUNT); in apbt_set_oneshot()
144 apbt_writel(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_set_oneshot()
151 unsigned long period = DIV_ROUND_UP(dw_ced->timer.freq, HZ); in apbt_set_periodic()
155 cpumask_first(evt->cpumask)); in apbt_set_periodic()
157 ctrl = apbt_readl(&dw_ced->timer, APBTMR_N_CONTROL); in apbt_set_periodic()
159 apbt_writel(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_set_periodic()
161 * DW APB p. 46, have to disable timer before load counter, in apbt_set_periodic()
165 apbt_writel(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_set_periodic()
168 apbt_writel(&dw_ced->timer, period, APBTMR_N_LOAD_COUNT); in apbt_set_periodic()
170 apbt_writel(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_set_periodic()
179 cpumask_first(evt->cpumask)); in apbt_resume()
181 apbt_enable_int(&dw_ced->timer); in apbt_resume()
192 ctrl = apbt_readl_relaxed(&dw_ced->timer, APBTMR_N_CONTROL); in apbt_next_event()
194 apbt_writel_relaxed(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_next_event()
196 apbt_writel_relaxed(&dw_ced->timer, delta, APBTMR_N_LOAD_COUNT); in apbt_next_event()
198 apbt_writel_relaxed(&dw_ced->timer, ctrl, APBTMR_N_CONTROL); in apbt_next_event()
204 * dw_apb_clockevent_init() - use an APB timer as a clock_event_device
206 * @cpu: The CPU the events will be targeted at or -1 if CPU affiliation
210 * @base: I/O base for the timer registers.
223 void __iomem *base, int irq, unsigned long freq) in dw_apb_clockevent_init() argument
232 dw_ced->timer.base = base; in dw_apb_clockevent_init()
233 dw_ced->timer.irq = irq; in dw_apb_clockevent_init()
234 dw_ced->timer.freq = freq; in dw_apb_clockevent_init()
236 clockevents_calc_mult_shift(&dw_ced->ced, freq, APBT_MIN_PERIOD); in dw_apb_clockevent_init()
237 dw_ced->ced.max_delta_ns = clockevent_delta2ns(0x7fffffff, in dw_apb_clockevent_init()
238 &dw_ced->ced); in dw_apb_clockevent_init()
239 dw_ced->ced.max_delta_ticks = 0x7fffffff; in dw_apb_clockevent_init()
240 dw_ced->ced.min_delta_ns = clockevent_delta2ns(5000, &dw_ced->ced); in dw_apb_clockevent_init()
241 dw_ced->ced.min_delta_ticks = 5000; in dw_apb_clockevent_init()
242 dw_ced->ced.cpumask = cpu < 0 ? cpu_possible_mask : cpumask_of(cpu); in dw_apb_clockevent_init()
243 dw_ced->ced.features = CLOCK_EVT_FEAT_PERIODIC | in dw_apb_clockevent_init()
245 dw_ced->ced.set_state_shutdown = apbt_shutdown; in dw_apb_clockevent_init()
246 dw_ced->ced.set_state_periodic = apbt_set_periodic; in dw_apb_clockevent_init()
247 dw_ced->ced.set_state_oneshot = apbt_set_oneshot; in dw_apb_clockevent_init()
248 dw_ced->ced.set_state_oneshot_stopped = apbt_shutdown; in dw_apb_clockevent_init()
249 dw_ced->ced.tick_resume = apbt_resume; in dw_apb_clockevent_init()
250 dw_ced->ced.set_next_event = apbt_next_event; in dw_apb_clockevent_init()
251 dw_ced->ced.irq = dw_ced->timer.irq; in dw_apb_clockevent_init()
252 dw_ced->ced.rating = rating; in dw_apb_clockevent_init()
253 dw_ced->ced.name = name; in dw_apb_clockevent_init()
255 dw_ced->eoi = apbt_eoi; in dw_apb_clockevent_init()
258 dw_ced->ced.name, &dw_ced->ced); in dw_apb_clockevent_init()
269 * dw_apb_clockevent_register() - register the clock with the generic layer
271 * @dw_ced: The APB clock to register as a clock_event_device.
275 apbt_writel(&dw_ced->timer, 0, APBTMR_N_CONTROL); in dw_apb_clockevent_register()
276 clockevents_register_device(&dw_ced->ced); in dw_apb_clockevent_register()
277 apbt_enable_int(&dw_ced->timer); in dw_apb_clockevent_register()
281 * dw_apb_clocksource_start() - start the clocksource counting.
294 u32 ctrl = apbt_readl(&dw_cs->timer, APBTMR_N_CONTROL); in dw_apb_clocksource_start()
297 apbt_writel(&dw_cs->timer, ctrl, APBTMR_N_CONTROL); in dw_apb_clocksource_start()
298 apbt_writel(&dw_cs->timer, ~0, APBTMR_N_LOAD_COUNT); in dw_apb_clocksource_start()
302 apbt_writel(&dw_cs->timer, ctrl, APBTMR_N_CONTROL); in dw_apb_clocksource_start()
313 current_count = apbt_readl_relaxed(&dw_cs->timer, in __apbt_read_clocksource()
328 * dw_apb_clocksource_init() - use an APB timer as a clocksource.
332 * @base: The I/O base for the timer registers.
335 * This creates a clocksource using an APB timer but does not yet register it
340 dw_apb_clocksource_init(unsigned rating, const char *name, void __iomem *base, in dw_apb_clocksource_init() argument
348 dw_cs->timer.base = base; in dw_apb_clocksource_init()
349 dw_cs->timer.freq = freq; in dw_apb_clocksource_init()
350 dw_cs->cs.name = name; in dw_apb_clocksource_init()
351 dw_cs->cs.rating = rating; in dw_apb_clocksource_init()
352 dw_cs->cs.read = __apbt_read_clocksource; in dw_apb_clocksource_init()
353 dw_cs->cs.mask = CLOCKSOURCE_MASK(32); in dw_apb_clocksource_init()
354 dw_cs->cs.flags = CLOCK_SOURCE_IS_CONTINUOUS; in dw_apb_clocksource_init()
355 dw_cs->cs.resume = apbt_restart_clocksource; in dw_apb_clocksource_init()
361 * dw_apb_clocksource_register() - register the APB clocksource.
367 clocksource_register_hz(&dw_cs->cs, dw_cs->timer.freq); in dw_apb_clocksource_register()
371 * dw_apb_clocksource_read() - read the current value of a clocksource.
377 return (u64)~apbt_readl(&dw_cs->timer, APBTMR_N_CURRENT_VALUE); in dw_apb_clocksource_read()