.. | .. |
---|
67 | 67 | struct clk *clk_ipg; |
---|
68 | 68 | const struct imx_gpt_data *gpt; |
---|
69 | 69 | struct clock_event_device ced; |
---|
70 | | - struct irqaction act; |
---|
71 | 70 | }; |
---|
72 | 71 | |
---|
73 | 72 | struct imx_gpt_data { |
---|
.. | .. |
---|
141 | 140 | return sched_clock_reg ? readl_relaxed(sched_clock_reg) : 0; |
---|
142 | 141 | } |
---|
143 | 142 | |
---|
| 143 | +#if defined(CONFIG_ARM) |
---|
144 | 144 | static struct delay_timer imx_delay_timer; |
---|
145 | 145 | |
---|
146 | 146 | static unsigned long imx_read_current_timer(void) |
---|
147 | 147 | { |
---|
148 | 148 | return readl_relaxed(sched_clock_reg); |
---|
149 | 149 | } |
---|
| 150 | +#endif |
---|
150 | 151 | |
---|
151 | 152 | static int __init mxc_clocksource_init(struct imx_timer *imxtm) |
---|
152 | 153 | { |
---|
153 | 154 | unsigned int c = clk_get_rate(imxtm->clk_per); |
---|
154 | 155 | void __iomem *reg = imxtm->base + imxtm->gpt->reg_tcn; |
---|
155 | 156 | |
---|
| 157 | +#if defined(CONFIG_ARM) |
---|
156 | 158 | imx_delay_timer.read_current_timer = &imx_read_current_timer; |
---|
157 | 159 | imx_delay_timer.freq = c; |
---|
158 | 160 | register_current_timer_delay(&imx_delay_timer); |
---|
| 161 | +#endif |
---|
159 | 162 | |
---|
160 | 163 | sched_clock_reg = reg; |
---|
161 | 164 | |
---|
.. | .. |
---|
198 | 201 | static int mxc_shutdown(struct clock_event_device *ced) |
---|
199 | 202 | { |
---|
200 | 203 | struct imx_timer *imxtm = to_imx_timer(ced); |
---|
201 | | - unsigned long flags; |
---|
202 | 204 | u32 tcn; |
---|
203 | | - |
---|
204 | | - /* |
---|
205 | | - * The timer interrupt generation is disabled at least |
---|
206 | | - * for enough time to call mxc_set_next_event() |
---|
207 | | - */ |
---|
208 | | - local_irq_save(flags); |
---|
209 | 205 | |
---|
210 | 206 | /* Disable interrupt in GPT module */ |
---|
211 | 207 | imxtm->gpt->gpt_irq_disable(imxtm); |
---|
.. | .. |
---|
221 | 217 | printk(KERN_INFO "%s: changing mode\n", __func__); |
---|
222 | 218 | #endif /* DEBUG */ |
---|
223 | 219 | |
---|
224 | | - local_irq_restore(flags); |
---|
225 | | - |
---|
226 | 220 | return 0; |
---|
227 | 221 | } |
---|
228 | 222 | |
---|
229 | 223 | static int mxc_set_oneshot(struct clock_event_device *ced) |
---|
230 | 224 | { |
---|
231 | 225 | struct imx_timer *imxtm = to_imx_timer(ced); |
---|
232 | | - unsigned long flags; |
---|
233 | | - |
---|
234 | | - /* |
---|
235 | | - * The timer interrupt generation is disabled at least |
---|
236 | | - * for enough time to call mxc_set_next_event() |
---|
237 | | - */ |
---|
238 | | - local_irq_save(flags); |
---|
239 | 226 | |
---|
240 | 227 | /* Disable interrupt in GPT module */ |
---|
241 | 228 | imxtm->gpt->gpt_irq_disable(imxtm); |
---|
.. | .. |
---|
260 | 247 | * mode switching |
---|
261 | 248 | */ |
---|
262 | 249 | imxtm->gpt->gpt_irq_enable(imxtm); |
---|
263 | | - local_irq_restore(flags); |
---|
264 | 250 | |
---|
265 | 251 | return 0; |
---|
266 | 252 | } |
---|
.. | .. |
---|
286 | 272 | static int __init mxc_clockevent_init(struct imx_timer *imxtm) |
---|
287 | 273 | { |
---|
288 | 274 | struct clock_event_device *ced = &imxtm->ced; |
---|
289 | | - struct irqaction *act = &imxtm->act; |
---|
290 | 275 | |
---|
291 | 276 | ced->name = "mxc_timer1"; |
---|
292 | 277 | ced->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_DYNIRQ; |
---|
.. | .. |
---|
300 | 285 | clockevents_config_and_register(ced, clk_get_rate(imxtm->clk_per), |
---|
301 | 286 | 0xff, 0xfffffffe); |
---|
302 | 287 | |
---|
303 | | - act->name = "i.MX Timer Tick"; |
---|
304 | | - act->flags = IRQF_TIMER | IRQF_IRQPOLL; |
---|
305 | | - act->handler = mxc_timer_interrupt; |
---|
306 | | - act->dev_id = ced; |
---|
307 | | - |
---|
308 | | - return setup_irq(imxtm->irq, act); |
---|
| 288 | + return request_irq(imxtm->irq, mxc_timer_interrupt, |
---|
| 289 | + IRQF_TIMER | IRQF_IRQPOLL, "i.MX Timer Tick", ced); |
---|
309 | 290 | } |
---|
310 | 291 | |
---|
311 | 292 | static void imx1_gpt_setup_tctl(struct imx_timer *imxtm) |
---|