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 80702c9ecc77..a59a13a665a6 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) | |||
69 | } | 69 | } |
70 | } | 70 | } |
71 | 71 | ||
72 | static struct clock_event_device ckevt_sa1100_osmr0 = { | ||
73 | .name = "osmr0", | ||
74 | .features = CLOCK_EVT_FEAT_ONESHOT, | ||
75 | .rating = 200, | ||
76 | .set_next_event = sa1100_osmr0_set_next_event, | ||
77 | .set_mode = sa1100_osmr0_set_mode, | ||
78 | }; | ||
79 | |||
80 | static struct irqaction sa1100_timer_irq = { | ||
81 | .name = "ost0", | ||
82 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | ||
83 | .handler = sa1100_ost0_interrupt, | ||
84 | .dev_id = &ckevt_sa1100_osmr0, | ||
85 | }; | ||
86 | |||
87 | static void __init sa1100_timer_init(void) | ||
88 | { | ||
89 | writel_relaxed(0, OIER); | ||
90 | writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR); | ||
91 | |||
92 | setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); | ||
93 | |||
94 | clockevents_calc_mult_shift(&ckevt_sa1100_osmr0, 3686400, 4); | ||
95 | ckevt_sa1100_osmr0.max_delta_ns = | ||
96 | clockevent_delta2ns(0x7fffffff, &ckevt_sa1100_osmr0); | ||
97 | ckevt_sa1100_osmr0.min_delta_ns = | ||
98 | clockevent_delta2ns(MIN_OSCR_DELTA * 2, &ckevt_sa1100_osmr0) + 1; | ||
99 | ckevt_sa1100_osmr0.cpumask = cpumask_of(0); | ||
100 | |||
101 | setup_irq(IRQ_OST0, &sa1100_timer_irq); | ||
102 | |||
103 | clocksource_mmio_init(OSCR, "oscr", CLOCK_TICK_RATE, 200, 32, | ||
104 | clocksource_mmio_readl_up); | ||
105 | clockevents_register_device(&ckevt_sa1100_osmr0); | ||
106 | } | ||
107 | |||
108 | #ifdef CONFIG_PM | 72 | #ifdef CONFIG_PM |
109 | unsigned long osmr[4], oier; | 73 | unsigned long osmr[4], oier; |
110 | 74 | ||
111 | static void sa1100_timer_suspend(void) | 75 | static void sa1100_timer_suspend(struct clock_event_device *cedev) |
112 | { | 76 | { |
113 | osmr[0] = readl_relaxed(OSMR0); | 77 | osmr[0] = readl_relaxed(OSMR0); |
114 | osmr[1] = readl_relaxed(OSMR1); | 78 | osmr[1] = readl_relaxed(OSMR1); |
@@ -117,7 +81,7 @@ static void sa1100_timer_suspend(void) | |||
117 | oier = readl_relaxed(OIER); | 81 | oier = readl_relaxed(OIER); |
118 | } | 82 | } |
119 | 83 | ||
120 | static void sa1100_timer_resume(void) | 84 | static void sa1100_timer_resume(struct clock_event_device *cedev) |
121 | { | 85 | { |
122 | writel_relaxed(0x0f, OSSR); | 86 | writel_relaxed(0x0f, OSSR); |
123 | writel_relaxed(osmr[0], OSMR0); | 87 | writel_relaxed(osmr[0], OSMR0); |
@@ -136,8 +100,36 @@ static void sa1100_timer_resume(void) | |||
136 | #define sa1100_timer_resume NULL | 100 | #define sa1100_timer_resume NULL |
137 | #endif | 101 | #endif |
138 | 102 | ||
139 | struct sys_timer sa1100_timer = { | 103 | static struct clock_event_device ckevt_sa1100_osmr0 = { |
140 | .init = sa1100_timer_init, | 104 | .name = "osmr0", |
105 | .features = CLOCK_EVT_FEAT_ONESHOT, | ||
106 | .rating = 200, | ||
107 | .set_next_event = sa1100_osmr0_set_next_event, | ||
108 | .set_mode = sa1100_osmr0_set_mode, | ||
141 | .suspend = sa1100_timer_suspend, | 109 | .suspend = sa1100_timer_suspend, |
142 | .resume = sa1100_timer_resume, | 110 | .resume = sa1100_timer_resume, |
143 | }; | 111 | }; |
112 | |||
113 | static struct irqaction sa1100_timer_irq = { | ||
114 | .name = "ost0", | ||
115 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | ||
116 | .handler = sa1100_ost0_interrupt, | ||
117 | .dev_id = &ckevt_sa1100_osmr0, | ||
118 | }; | ||
119 | |||
120 | void __init sa1100_timer_init(void) | ||
121 | { | ||
122 | writel_relaxed(0, OIER); | ||
123 | writel_relaxed(OSSR_M0 | OSSR_M1 | OSSR_M2 | OSSR_M3, OSSR); | ||
124 | |||
125 | setup_sched_clock(sa1100_read_sched_clock, 32, 3686400); | ||
126 | |||
127 | ckevt_sa1100_osmr0.cpumask = cpumask_of(0); | ||
128 | |||
129 | setup_irq(IRQ_OST0, &sa1100_timer_irq); | ||
130 | |||
131 | clocksource_mmio_init(OSCR, "oscr", CLOCK_TICK_RATE, 200, 32, | ||
132 | clocksource_mmio_readl_up); | ||
133 | clockevents_config_and_register(&ckevt_sa1100_osmr0, 3686400, | ||
134 | MIN_OSCR_DELTA * 2, 0x7fffffff); | ||
135 | } | ||