Lines Matching defs:imxtm
81 void (*gpt_setup_tctl)(struct imx_timer *imxtm);
82 void (*gpt_irq_enable)(struct imx_timer *imxtm);
83 void (*gpt_irq_disable)(struct imx_timer *imxtm);
84 void (*gpt_irq_acknowledge)(struct imx_timer *imxtm);
94 static void imx1_gpt_irq_disable(struct imx_timer *imxtm)
98 tmp = readl_relaxed(imxtm->base + MXC_TCTL);
99 writel_relaxed(tmp & ~MX1_2_TCTL_IRQEN, imxtm->base + MXC_TCTL);
102 static void imx31_gpt_irq_disable(struct imx_timer *imxtm)
104 writel_relaxed(0, imxtm->base + V2_IR);
107 static void imx1_gpt_irq_enable(struct imx_timer *imxtm)
111 tmp = readl_relaxed(imxtm->base + MXC_TCTL);
112 writel_relaxed(tmp | MX1_2_TCTL_IRQEN, imxtm->base + MXC_TCTL);
115 static void imx31_gpt_irq_enable(struct imx_timer *imxtm)
117 writel_relaxed(1<<0, imxtm->base + V2_IR);
120 static void imx1_gpt_irq_acknowledge(struct imx_timer *imxtm)
122 writel_relaxed(0, imxtm->base + MX1_2_TSTAT);
125 static void imx21_gpt_irq_acknowledge(struct imx_timer *imxtm)
128 imxtm->base + MX1_2_TSTAT);
131 static void imx31_gpt_irq_acknowledge(struct imx_timer *imxtm)
133 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);
300 static void imx31_gpt_setup_tctl(struct imx_timer *imxtm)
305 if (clk_get_rate(imxtm->clk_per) == V2_TIMER_RATE_OSC_DIV8)
310 writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
313 static void imx6dl_gpt_setup_tctl(struct imx_timer *imxtm)
318 if (clk_get_rate(imxtm->clk_per) == V2_TIMER_RATE_OSC_DIV8) {
321 writel_relaxed(7 << V2_TPRER_PRE24M, imxtm->base + MXC_TPRER);
327 writel_relaxed(tctl_val, imxtm->base + MXC_TCTL);
374 static int __init _mxc_timer_init(struct imx_timer *imxtm)
378 switch (imxtm->type) {
380 imxtm->gpt = &imx1_gpt_data;
383 imxtm->gpt = &imx21_gpt_data;
386 imxtm->gpt = &imx31_gpt_data;
389 imxtm->gpt = &imx6dl_gpt_data;
395 if (IS_ERR(imxtm->clk_per)) {
397 return PTR_ERR(imxtm->clk_per);
400 if (!IS_ERR(imxtm->clk_ipg))
401 clk_prepare_enable(imxtm->clk_ipg);
403 clk_prepare_enable(imxtm->clk_per);
409 writel_relaxed(0, imxtm->base + MXC_TCTL);
410 writel_relaxed(0, imxtm->base + MXC_TPRER); /* see datasheet note */
412 imxtm->gpt->gpt_setup_tctl(imxtm);
415 ret = mxc_clocksource_init(imxtm);
419 return mxc_clockevent_init(imxtm);
424 struct imx_timer *imxtm;
432 imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL);
433 if (!imxtm)
436 imxtm->base = of_iomap(np, 0);
437 if (!imxtm->base) {
442 imxtm->irq = irq_of_parse_and_map(np, 0);
443 if (imxtm->irq <= 0) {
448 imxtm->clk_ipg = of_clk_get_by_name(np, "ipg");
451 imxtm->clk_per = of_clk_get_by_name(np, "osc_per");
452 if (IS_ERR(imxtm->clk_per))
453 imxtm->clk_per = of_clk_get_by_name(np, "per");
455 imxtm->type = type;
457 ret = _mxc_timer_init(imxtm);
466 kfree(imxtm);