Lines Matching +full:ixp4xx +full:- +full:timer
1 // SPDX-License-Identifier: GPL-2.0
3 * IXP4 timer driver
6 * Based on arch/arm/mach-ixp4xx/common.c
8 * Copyright 2003-2004 (C) MontaVista, Software, Inc.
22 #include <linux/platform_data/timer-ixp4xx.h>
25 * Constants to make it easy to access Timer Control/Status registers
28 #define IXP4XX_OST1_OFFSET 0x04 /* Timer 1 Timestamp */
29 #define IXP4XX_OSRT1_OFFSET 0x08 /* Timer 1 Reload */
30 #define IXP4XX_OST2_OFFSET 0x0C /* Timer 2 Timestamp */
31 #define IXP4XX_OSRT2_OFFSET 0x10 /* Timer 2 Reload */
32 #define IXP4XX_OSWT_OFFSET 0x14 /* Watchdog Timer */
35 #define IXP4XX_OSST_OFFSET 0x20 /* Timer Status */
38 * Timer register values and bit definitions
67 * A local singleton used by sched_clock and delay timer reads, which are
80 return __raw_readl(local_ixp4xx_timer->base + IXP4XX_OSTS_OFFSET); in ixp4xx_read_timer()
96 struct clock_event_device *evt = &tmr->clkevt; in ixp4xx_timer_interrupt()
100 tmr->base + IXP4XX_OSST_OFFSET); in ixp4xx_timer_interrupt()
102 evt->event_handler(evt); in ixp4xx_timer_interrupt()
113 val = __raw_readl(tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_set_next_event()
117 tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_set_next_event()
127 val = __raw_readl(tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_shutdown()
129 __raw_writel(val, tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_shutdown()
139 tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_set_oneshot()
149 val = tmr->latch & ~IXP4XX_OST_RELOAD_MASK; in ixp4xx_set_periodic()
151 __raw_writel(val, tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_set_periodic()
161 val = __raw_readl(tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_resume()
163 __raw_writel(val, tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_resume()
169 * IXP4xx timer tick
170 * We use OS timer1 on the CPU for the timer tick and the timestamp
182 return -ENOMEM; in ixp4xx_timer_register()
183 tmr->base = base; in ixp4xx_timer_register()
184 tmr->tick_rate = timer_freq; in ixp4xx_timer_register()
187 * The timer register doesn't allow to specify the two least in ixp4xx_timer_register()
192 tmr->latch = DIV_ROUND_CLOSEST(timer_freq, in ixp4xx_timer_register()
199 __raw_writel(0, tmr->base + IXP4XX_OSRT1_OFFSET); in ixp4xx_timer_register()
201 /* Clear any pending interrupt on timer 1 */ in ixp4xx_timer_register()
203 tmr->base + IXP4XX_OSST_OFFSET); in ixp4xx_timer_register()
205 /* Reset time-stamp counter */ in ixp4xx_timer_register()
206 __raw_writel(0, tmr->base + IXP4XX_OSTS_OFFSET); in ixp4xx_timer_register()
211 tmr->clkevt.name = "ixp4xx timer1"; in ixp4xx_timer_register()
212 tmr->clkevt.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; in ixp4xx_timer_register()
213 tmr->clkevt.rating = 200; in ixp4xx_timer_register()
214 tmr->clkevt.set_state_shutdown = ixp4xx_shutdown; in ixp4xx_timer_register()
215 tmr->clkevt.set_state_periodic = ixp4xx_set_periodic; in ixp4xx_timer_register()
216 tmr->clkevt.set_state_oneshot = ixp4xx_set_oneshot; in ixp4xx_timer_register()
217 tmr->clkevt.tick_resume = ixp4xx_resume; in ixp4xx_timer_register()
218 tmr->clkevt.set_next_event = ixp4xx_set_next_event; in ixp4xx_timer_register()
219 tmr->clkevt.cpumask = cpumask_of(0); in ixp4xx_timer_register()
220 tmr->clkevt.irq = timer_irq; in ixp4xx_timer_register()
222 IRQF_TIMER, "IXP4XX-TIMER1", tmr); in ixp4xx_timer_register()
224 pr_crit("no timer IRQ\n"); in ixp4xx_timer_register()
225 return -ENODEV; in ixp4xx_timer_register()
227 clockevents_config_and_register(&tmr->clkevt, timer_freq, in ixp4xx_timer_register()
233 /* Also use this timer for delays */ in ixp4xx_timer_register()
234 tmr->delay_timer.read_current_timer = ixp4xx_read_timer; in ixp4xx_timer_register()
235 tmr->delay_timer.freq = timer_freq; in ixp4xx_timer_register()
236 register_current_timer_delay(&tmr->delay_timer); in ixp4xx_timer_register()
243 * ixp4xx_timer_setup() - Timer setup function to be called from boardfiles
244 * @timerbase: physical base of timer block
245 * @timer_irq: Linux IRQ number for the timer
246 * @timer_freq: Fixed frequency of the timer
256 pr_crit("IXP4xx: can't remap timer\n"); in ixp4xx_timer_setup()
272 pr_crit("IXP4xx: can't remap timer\n"); in ixp4xx_of_timer_init()
273 return -ENODEV; in ixp4xx_of_timer_init()
279 ret = -EINVAL; in ixp4xx_of_timer_init()
293 TIMER_OF_DECLARE(ixp4xx, "intel,ixp4xx-timer", ixp4xx_of_timer_init);