diff options
Diffstat (limited to 'arch/arm/mach-sa1100/time.c')
| -rw-r--r-- | arch/arm/mach-sa1100/time.c | 72 | 
1 files changed, 32 insertions, 40 deletions
diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index 80702c9ecc7..a59a13a665a 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c @@ -69,46 +69,10 @@ sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c)  	}  } -static struct clock_event_device ckevt_sa1100_osmr0 = { -	.name		= "osmr0", -	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.rating		= 200, -	.set_next_event	= sa1100_osmr0_set_next_event, -	.set_mode	= sa1100_osmr0_set_mode, -}; - -static struct irqaction sa1100_timer_irq = { -	.name		= "ost0", -	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, -	.handler	= sa1100_ost0_interrupt, -	.dev_id		= &ckevt_sa1100_osmr0, -}; - -static void __init sa1100_timer_init(void) -{ -	writel_relaxed(0, OIER); -	writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR); - -	setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); - -	clockevents_calc_mult_shift(&ckevt_sa1100_osmr0, 3686400, 4); -	ckevt_sa1100_osmr0.max_delta_ns = -		clockevent_delta2ns(0x7fffffff, &ckevt_sa1100_osmr0); -	ckevt_sa1100_osmr0.min_delta_ns = -		clockevent_delta2ns(MIN_OSCR_DELTA * 2, &ckevt_sa1100_osmr0) + 1; -	ckevt_sa1100_osmr0.cpumask = cpumask_of(0); - -	setup_irq(IRQ_OST0, &sa1100_timer_irq); - -	clocksource_mmio_init(OSCR, "oscr", CLOCK_TICK_RATE, 200, 32, -		clocksource_mmio_readl_up); -	clockevents_register_device(&ckevt_sa1100_osmr0); -} -  #ifdef CONFIG_PM  unsigned long osmr[4], oier; -static void sa1100_timer_suspend(void) +static void sa1100_timer_suspend(struct clock_event_device *cedev)  {  	osmr[0] = readl_relaxed(OSMR0);  	osmr[1] = readl_relaxed(OSMR1); @@ -117,7 +81,7 @@ static void sa1100_timer_suspend(void)  	oier = readl_relaxed(OIER);  } -static void sa1100_timer_resume(void) +static void sa1100_timer_resume(struct clock_event_device *cedev)  {  	writel_relaxed(0x0f, OSSR);  	writel_relaxed(osmr[0], OSMR0); @@ -136,8 +100,36 @@ static void sa1100_timer_resume(void)  #define sa1100_timer_resume NULL  #endif -struct sys_timer sa1100_timer = { -	.init		= sa1100_timer_init, +static struct clock_event_device ckevt_sa1100_osmr0 = { +	.name		= "osmr0", +	.features	= CLOCK_EVT_FEAT_ONESHOT, +	.rating		= 200, +	.set_next_event	= sa1100_osmr0_set_next_event, +	.set_mode	= sa1100_osmr0_set_mode,  	.suspend	= sa1100_timer_suspend,  	.resume		= sa1100_timer_resume,  }; + +static struct irqaction sa1100_timer_irq = { +	.name		= "ost0", +	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, +	.handler	= sa1100_ost0_interrupt, +	.dev_id		= &ckevt_sa1100_osmr0, +}; + +void __init sa1100_timer_init(void) +{ +	writel_relaxed(0, OIER); +	writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR); + +	setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); + +	ckevt_sa1100_osmr0.cpumask = cpumask_of(0); + +	setup_irq(IRQ_OST0, &sa1100_timer_irq); + +	clocksource_mmio_init(OSCR, "oscr", CLOCK_TICK_RATE, 200, 32, +		clocksource_mmio_readl_up); +	clockevents_config_and_register(&ckevt_sa1100_osmr0, 3686400, +					MIN_OSCR_DELTA * 2, 0x7fffffff); +}  |