Lines Matching refs:etsects
135 struct etsects { struct
157 static u64 tmr_cnt_read(struct etsects *etsects) in tmr_cnt_read() argument
162 lo = gfar_read(&etsects->regs->tmr_cnt_l); in tmr_cnt_read()
163 hi = gfar_read(&etsects->regs->tmr_cnt_h); in tmr_cnt_read()
170 static void tmr_cnt_write(struct etsects *etsects, u64 ns) in tmr_cnt_write() argument
175 gfar_write(&etsects->regs->tmr_cnt_l, lo); in tmr_cnt_write()
176 gfar_write(&etsects->regs->tmr_cnt_h, hi); in tmr_cnt_write()
180 static void set_alarm(struct etsects *etsects) in set_alarm() argument
185 ns = tmr_cnt_read(etsects) + 1500000000ULL; in set_alarm()
187 ns -= etsects->tclk_period; in set_alarm()
190 gfar_write(&etsects->regs->tmr_alarm1_l, lo); in set_alarm()
191 gfar_write(&etsects->regs->tmr_alarm1_h, hi); in set_alarm()
195 static void set_fipers(struct etsects *etsects) in set_fipers() argument
197 set_alarm(etsects); in set_fipers()
198 gfar_write(&etsects->regs->tmr_fiper1, etsects->tmr_fiper1); in set_fipers()
199 gfar_write(&etsects->regs->tmr_fiper2, etsects->tmr_fiper2); in set_fipers()
208 struct etsects *etsects = priv; in isr() local
213 val = gfar_read(&etsects->regs->tmr_tevent); in isr()
217 hi = gfar_read(&etsects->regs->tmr_etts1_h); in isr()
218 lo = gfar_read(&etsects->regs->tmr_etts1_l); in isr()
223 ptp_clock_event(etsects->clock, &event); in isr()
228 hi = gfar_read(&etsects->regs->tmr_etts2_h); in isr()
229 lo = gfar_read(&etsects->regs->tmr_etts2_l); in isr()
234 ptp_clock_event(etsects->clock, &event); in isr()
239 if (etsects->alarm_value) { in isr()
242 event.timestamp = etsects->alarm_value; in isr()
243 ptp_clock_event(etsects->clock, &event); in isr()
245 if (etsects->alarm_interval) { in isr()
246 ns = etsects->alarm_value + etsects->alarm_interval; in isr()
249 spin_lock(&etsects->lock); in isr()
250 gfar_write(&etsects->regs->tmr_alarm2_l, lo); in isr()
251 gfar_write(&etsects->regs->tmr_alarm2_h, hi); in isr()
252 spin_unlock(&etsects->lock); in isr()
253 etsects->alarm_value = ns; in isr()
255 gfar_write(&etsects->regs->tmr_tevent, ALM2); in isr()
256 spin_lock(&etsects->lock); in isr()
257 mask = gfar_read(&etsects->regs->tmr_temask); in isr()
259 gfar_write(&etsects->regs->tmr_temask, mask); in isr()
260 spin_unlock(&etsects->lock); in isr()
261 etsects->alarm_value = 0; in isr()
262 etsects->alarm_interval = 0; in isr()
269 ptp_clock_event(etsects->clock, &event); in isr()
273 gfar_write(&etsects->regs->tmr_tevent, ack); in isr()
288 struct etsects *etsects = container_of(ptp, struct etsects, caps); in ptp_gianfar_adjfreq() local
294 tmr_add = etsects->tmr_add; in ptp_gianfar_adjfreq()
301 gfar_write(&etsects->regs->tmr_add, tmr_add); in ptp_gianfar_adjfreq()
310 struct etsects *etsects = container_of(ptp, struct etsects, caps); in ptp_gianfar_adjtime() local
312 spin_lock_irqsave(&etsects->lock, flags); in ptp_gianfar_adjtime()
314 now = tmr_cnt_read(etsects); in ptp_gianfar_adjtime()
316 tmr_cnt_write(etsects, now); in ptp_gianfar_adjtime()
318 spin_unlock_irqrestore(&etsects->lock, flags); in ptp_gianfar_adjtime()
320 set_fipers(etsects); in ptp_gianfar_adjtime()
330 struct etsects *etsects = container_of(ptp, struct etsects, caps); in ptp_gianfar_gettime() local
332 spin_lock_irqsave(&etsects->lock, flags); in ptp_gianfar_gettime()
334 ns = tmr_cnt_read(etsects); in ptp_gianfar_gettime()
336 spin_unlock_irqrestore(&etsects->lock, flags); in ptp_gianfar_gettime()
348 struct etsects *etsects = container_of(ptp, struct etsects, caps); in ptp_gianfar_settime() local
352 spin_lock_irqsave(&etsects->lock, flags); in ptp_gianfar_settime()
354 tmr_cnt_write(etsects, ns); in ptp_gianfar_settime()
355 set_fipers(etsects); in ptp_gianfar_settime()
357 spin_unlock_irqrestore(&etsects->lock, flags); in ptp_gianfar_settime()
365 struct etsects *etsects = container_of(ptp, struct etsects, caps); in ptp_gianfar_enable() local
381 spin_lock_irqsave(&etsects->lock, flags); in ptp_gianfar_enable()
382 mask = gfar_read(&etsects->regs->tmr_temask); in ptp_gianfar_enable()
387 gfar_write(&etsects->regs->tmr_temask, mask); in ptp_gianfar_enable()
388 spin_unlock_irqrestore(&etsects->lock, flags); in ptp_gianfar_enable()
392 spin_lock_irqsave(&etsects->lock, flags); in ptp_gianfar_enable()
393 mask = gfar_read(&etsects->regs->tmr_temask); in ptp_gianfar_enable()
398 gfar_write(&etsects->regs->tmr_temask, mask); in ptp_gianfar_enable()
399 spin_unlock_irqrestore(&etsects->lock, flags); in ptp_gianfar_enable()
441 struct etsects *etsects; in gianfar_ptp_probe() local
447 etsects = kzalloc(sizeof(*etsects), GFP_KERNEL); in gianfar_ptp_probe()
448 if (!etsects) in gianfar_ptp_probe()
453 etsects->caps = ptp_gianfar_caps; in gianfar_ptp_probe()
455 if (get_of_u32(node, "fsl,cksel", &etsects->cksel)) in gianfar_ptp_probe()
456 etsects->cksel = DEFAULT_CKSEL; in gianfar_ptp_probe()
458 if (get_of_u32(node, "fsl,tclk-period", &etsects->tclk_period) || in gianfar_ptp_probe()
459 get_of_u32(node, "fsl,tmr-prsc", &etsects->tmr_prsc) || in gianfar_ptp_probe()
460 get_of_u32(node, "fsl,tmr-add", &etsects->tmr_add) || in gianfar_ptp_probe()
461 get_of_u32(node, "fsl,tmr-fiper1", &etsects->tmr_fiper1) || in gianfar_ptp_probe()
462 get_of_u32(node, "fsl,tmr-fiper2", &etsects->tmr_fiper2) || in gianfar_ptp_probe()
463 get_of_u32(node, "fsl,max-adj", &etsects->caps.max_adj)) { in gianfar_ptp_probe()
468 etsects->irq = platform_get_irq(dev, 0); in gianfar_ptp_probe()
470 if (etsects->irq == NO_IRQ) { in gianfar_ptp_probe()
474 if (request_irq(etsects->irq, isr, 0, DRIVER, etsects)) { in gianfar_ptp_probe()
479 etsects->rsrc = platform_get_resource(dev, IORESOURCE_MEM, 0); in gianfar_ptp_probe()
480 if (!etsects->rsrc) { in gianfar_ptp_probe()
484 if (request_resource(&iomem_resource, etsects->rsrc)) { in gianfar_ptp_probe()
489 spin_lock_init(&etsects->lock); in gianfar_ptp_probe()
491 etsects->regs = ioremap(etsects->rsrc->start, in gianfar_ptp_probe()
492 resource_size(etsects->rsrc)); in gianfar_ptp_probe()
493 if (!etsects->regs) { in gianfar_ptp_probe()
498 ptp_gianfar_settime(&etsects->caps, &now); in gianfar_ptp_probe()
501 (etsects->tclk_period & TCLK_PERIOD_MASK) << TCLK_PERIOD_SHIFT | in gianfar_ptp_probe()
502 (etsects->cksel & CKSEL_MASK) << CKSEL_SHIFT; in gianfar_ptp_probe()
504 spin_lock_irqsave(&etsects->lock, flags); in gianfar_ptp_probe()
506 gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl); in gianfar_ptp_probe()
507 gfar_write(&etsects->regs->tmr_add, etsects->tmr_add); in gianfar_ptp_probe()
508 gfar_write(&etsects->regs->tmr_prsc, etsects->tmr_prsc); in gianfar_ptp_probe()
509 gfar_write(&etsects->regs->tmr_fiper1, etsects->tmr_fiper1); in gianfar_ptp_probe()
510 gfar_write(&etsects->regs->tmr_fiper2, etsects->tmr_fiper2); in gianfar_ptp_probe()
511 set_alarm(etsects); in gianfar_ptp_probe()
512 gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl|FS|RTPE|TE|FRD); in gianfar_ptp_probe()
514 spin_unlock_irqrestore(&etsects->lock, flags); in gianfar_ptp_probe()
516 etsects->clock = ptp_clock_register(&etsects->caps, &dev->dev); in gianfar_ptp_probe()
517 if (IS_ERR(etsects->clock)) { in gianfar_ptp_probe()
518 err = PTR_ERR(etsects->clock); in gianfar_ptp_probe()
521 gfar_phc_index = ptp_clock_index(etsects->clock); in gianfar_ptp_probe()
523 platform_set_drvdata(dev, etsects); in gianfar_ptp_probe()
528 iounmap(etsects->regs); in gianfar_ptp_probe()
530 release_resource(etsects->rsrc); in gianfar_ptp_probe()
532 free_irq(etsects->irq, etsects); in gianfar_ptp_probe()
534 kfree(etsects); in gianfar_ptp_probe()
541 struct etsects *etsects = platform_get_drvdata(dev); in gianfar_ptp_remove() local
543 gfar_write(&etsects->regs->tmr_temask, 0); in gianfar_ptp_remove()
544 gfar_write(&etsects->regs->tmr_ctrl, 0); in gianfar_ptp_remove()
547 ptp_clock_unregister(etsects->clock); in gianfar_ptp_remove()
548 iounmap(etsects->regs); in gianfar_ptp_remove()
549 release_resource(etsects->rsrc); in gianfar_ptp_remove()
550 free_irq(etsects->irq, etsects); in gianfar_ptp_remove()
551 kfree(etsects); in gianfar_ptp_remove()