Lines Matching defs:imxtm
76 void (*gpt_setup_tctl)(struct imx_timer *imxtm);
77 void (*gpt_irq_enable)(struct imx_timer *imxtm);
78 void (*gpt_irq_disable)(struct imx_timer *imxtm);
79 void (*gpt_irq_acknowledge)(struct imx_timer *imxtm);
89 static void imx1_gpt_irq_disable(struct imx_timer *imxtm)
93 tmp = readl_relaxed(imxtm->base + MXC_TCTL);
94 writel_relaxed(tmp & ~MX1_2_TCTL_IRQEN, imxtm->base + MXC_TCTL);
98 static void imx31_gpt_irq_disable(struct imx_timer *imxtm)
100 writel_relaxed(0, imxtm->base + V2_IR);
104 static void imx1_gpt_irq_enable(struct imx_timer *imxtm)
108 tmp = readl_relaxed(imxtm->base + MXC_TCTL);
109 writel_relaxed(tmp | MX1_2_TCTL_IRQEN, imxtm->base + MXC_TCTL);
113 static void imx31_gpt_irq_enable(struct imx_timer *imxtm)
115 writel_relaxed(1<<0, imxtm->base + V2_IR);
119 static void imx1_gpt_irq_acknowledge(struct imx_timer *imxtm)
121 writel_relaxed(0, imxtm->base + MX1_2_TSTAT);
124 static void imx21_gpt_irq_acknowledge(struct imx_timer *imxtm)
127 imxtm->base + MX1_2_TSTAT);
130 static void imx31_gpt_irq_acknowledge(struct imx_timer *imxtm)
132 writel_relaxed(V2_TSTAT_OF1, imxtm->base + V2_TSTAT);
152 static int __init mxc_clocksource_init(struct imx_timer *imxtm)
154 unsigned int c = clk_get_rate(imxtm->clk_per);
155 void __iomem *reg = imxtm->base + imxtm->gpt->reg_tcn;
175 struct imx_timer *imxtm = to_imx_timer(ced);
178 tcmp = readl_relaxed(imxtm->base + MX1_2_TCN) + evt;
180 writel_relaxed(tcmp, imxtm->base + MX1_2_TCMP);
182 return (int)(tcmp - readl_relaxed(imxtm->base + MX1_2_TCN)) < 0 ?
189 struct imx_timer *imxtm = to_imx_timer(ced);
192 tcmp = readl_relaxed(imxtm->base + V2_TCN) + evt;
194 writel_relaxed(tcmp, imxtm->base + V2_TCMP);
197 (int)(tcmp - readl_relaxed(imxtm->base + V2_TCN)) < 0 ?
203 struct imx_timer *imxtm = to_imx_timer(ced);
207 imxtm->gpt->gpt_irq_disable(imxtm);
209 tcn = readl_relaxed(imxtm->base + imxtm->gpt->reg_tcn);
211 writel_relaxed(tcn - 3, imxtm->base + imxtm->gpt->reg_tcmp);
214 imxtm->gpt->gpt_irq_acknowledge(imxtm);
225 struct imx_timer *imxtm = to_imx_timer(ced);
228 imxtm->gpt->gpt_irq_disable(imxtm);
231 u32 tcn = readl_relaxed(imxtm->base + imxtm->gpt->reg_tcn);
233 writel_relaxed(tcn - 3, imxtm->base + imxtm->gpt->reg_tcmp);
236 imxtm->gpt->gpt_irq_acknowledge(imxtm);
249 imxtm->gpt->gpt_irq_enable(imxtm);
260 struct imx_timer *imxtm = to_imx_timer(ced);
263 tstat = readl_relaxed(imxtm->base + imxtm->gpt->reg_tstat);
265 imxtm->gpt->gpt_irq_acknowledge(imxtm);
272 static int __init mxc_clockevent_init(struct imx_timer *imxtm)
274 struct clock_event_device *ced = &imxtm->ced;
281 ced->set_next_event = imxtm->gpt->set_next_event;
284 ced->irq = imxtm->irq;
285 clockevents_config_and_register(ced, clk_get_rate(imxtm->clk_per),
288 return request_irq(imxtm->irq, mxc_timer_interrupt,
292 static void imx1_gpt_setup_tctl(struct imx_timer *imxtm)
297 writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
301 static void imx31_gpt_setup_tctl(struct imx_timer *imxtm)
306 if (clk_get_rate(imxtm->clk_per) == V2_TIMER_RATE_OSC_DIV8)
311 writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
314 static void imx6dl_gpt_setup_tctl(struct imx_timer *imxtm)
319 if (clk_get_rate(imxtm->clk_per) == V2_TIMER_RATE_OSC_DIV8) {
322 writel_relaxed(7 << V2_TPRER_PRE24M, imxtm->base + MXC_TPRER);
328 writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
375 static int __init _mxc_timer_init(struct imx_timer *imxtm)
379 switch (imxtm->type) {
381 imxtm->gpt = &imx1_gpt_data;
384 imxtm->gpt = &imx21_gpt_data;
387 imxtm->gpt = &imx31_gpt_data;
390 imxtm->gpt = &imx6dl_gpt_data;
396 if (IS_ERR(imxtm->clk_per)) {
398 return PTR_ERR(imxtm->clk_per);
401 if (!IS_ERR(imxtm->clk_ipg))
402 clk_prepare_enable(imxtm->clk_ipg);
404 clk_prepare_enable(imxtm->clk_per);
410 writel_relaxed(0, imxtm->base + MXC_TCTL);
411 writel_relaxed(0, imxtm->base + MXC_TPRER); /* see datasheet note */
413 imxtm->gpt->gpt_setup_tctl(imxtm);
416 ret = mxc_clocksource_init(imxtm);
420 return mxc_clockevent_init(imxtm);
425 struct imx_timer *imxtm;
427 imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL);
428 BUG_ON(!imxtm);
430 imxtm->clk_per = clk_get_sys("imx-gpt.0", "per");
431 imxtm->clk_ipg = clk_get_sys("imx-gpt.0", "ipg");
433 imxtm->base = ioremap(pbase, SZ_4K);
434 BUG_ON(!imxtm->base);
436 imxtm->type = type;
437 imxtm->irq = irq;
439 _mxc_timer_init(imxtm);
444 struct imx_timer *imxtm;
452 imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL);
453 if (!imxtm)
456 imxtm->base = of_iomap(np, 0);
457 if (!imxtm->base) {
462 imxtm->irq = irq_of_parse_and_map(np, 0);
463 if (imxtm->irq <= 0) {
468 imxtm->clk_ipg = of_clk_get_by_name(np, "ipg");
471 imxtm->clk_per = of_clk_get_by_name(np, "osc_per");
472 if (IS_ERR(imxtm->clk_per))
473 imxtm->clk_per = of_clk_get_by_name(np, "per");
475 imxtm->type = type;
477 ret = _mxc_timer_init(imxtm);
486 kfree(imxtm);