Lines Matching full:ptp

3  * PTP 1588 clock support
30 .name = "ptp",
97 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); in ptp_clock_settime() local
99 if (ptp_clock_freerun(ptp)) { in ptp_clock_settime()
100 pr_err_ratelimited("ptp: physical clock is free running\n"); in ptp_clock_settime()
107 return ptp->info->settime64(ptp->info, tp); in ptp_clock_settime()
112 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); in ptp_clock_gettime() local
115 if (ptp->info->gettimex64) in ptp_clock_gettime()
116 err = ptp->info->gettimex64(ptp->info, tp, NULL); in ptp_clock_gettime()
118 err = ptp->info->gettime64(ptp->info, tp); in ptp_clock_gettime()
124 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); in ptp_clock_adjtime() local
129 ptp_clock_freerun(ptp)) { in ptp_clock_adjtime()
130 pr_err("ptp: physical clock is free running\n"); in ptp_clock_adjtime()
134 ops = ptp->info; in ptp_clock_adjtime()
167 ptp->dialed_frequency = tx->freq; in ptp_clock_adjtime()
182 tx->freq = ptp->dialed_frequency; in ptp_clock_adjtime()
204 struct ptp_clock *ptp = container_of(dev, struct ptp_clock, dev); in ptp_clock_release() local
208 ptp_cleanup_pin_groups(ptp); in ptp_clock_release()
209 kfree(ptp->vclock_index); in ptp_clock_release()
210 mutex_destroy(&ptp->pincfg_mux); in ptp_clock_release()
211 mutex_destroy(&ptp->n_vclocks_mux); in ptp_clock_release()
213 spin_lock_irqsave(&ptp->tsevqs_lock, flags); in ptp_clock_release()
214 tsevq = list_first_entry(&ptp->tsevqs, struct timestamp_event_queue, in ptp_clock_release()
217 spin_unlock_irqrestore(&ptp->tsevqs_lock, flags); in ptp_clock_release()
220 debugfs_remove(ptp->debugfs_root); in ptp_clock_release()
221 xa_erase(&ptp_clocks_map, ptp->index); in ptp_clock_release()
222 kfree(ptp); in ptp_clock_release()
233 static int ptp_enable(struct ptp_clock_info *ptp, struct ptp_clock_request *request, int on) in ptp_enable() argument
240 struct ptp_clock *ptp = container_of(work, struct ptp_clock, in ptp_aux_kworker() local
242 struct ptp_clock_info *info = ptp->info; in ptp_aux_kworker()
248 kthread_queue_delayed_work(ptp->kworker, &ptp->aux_work, delay); in ptp_aux_kworker()
255 struct ptp_clock *ptp = filep->private_data; in ptp_n_perout_loopback_read() local
258 snprintf(buf, sizeof(buf), "%d\n", ptp->info->n_per_lp); in ptp_n_perout_loopback_read()
273 struct ptp_clock *ptp = filep->private_data; in ptp_perout_loopback_write() local
274 struct ptp_clock_info *ops = ptp->info; in ptp_perout_loopback_write()
319 struct ptp_clock *ptp; in ptp_clock_register() local
331 ptp = kzalloc_obj(struct ptp_clock); in ptp_clock_register()
332 if (!ptp) { in ptp_clock_register()
337 err = xa_alloc(&ptp_clocks_map, &index, ptp, xa_limit_31b, in ptp_clock_register()
342 ptp->clock.ops = ptp_clock_ops; in ptp_clock_register()
343 ptp->info = info; in ptp_clock_register()
344 ptp->devid = MKDEV(major, index); in ptp_clock_register()
345 ptp->index = index; in ptp_clock_register()
346 INIT_LIST_HEAD(&ptp->tsevqs); in ptp_clock_register()
352 list_add_tail(&queue->qlist, &ptp->tsevqs); in ptp_clock_register()
353 spin_lock_init(&ptp->tsevqs_lock); in ptp_clock_register()
361 mutex_init(&ptp->pincfg_mux); in ptp_clock_register()
362 mutex_init(&ptp->n_vclocks_mux); in ptp_clock_register()
363 init_waitqueue_head(&ptp->tsev_wq); in ptp_clock_register()
365 if (ptp->info->getcycles64 || ptp->info->getcyclesx64) { in ptp_clock_register()
366 ptp->has_cycles = true; in ptp_clock_register()
367 if (!ptp->info->getcycles64 && ptp->info->getcyclesx64) in ptp_clock_register()
368 ptp->info->getcycles64 = ptp_getcycles64; in ptp_clock_register()
371 ptp->info->getcycles64 = ptp_getcycles64; in ptp_clock_register()
373 if (ptp->info->gettimex64) in ptp_clock_register()
374 ptp->info->getcyclesx64 = ptp->info->gettimex64; in ptp_clock_register()
376 if (ptp->info->getcrosststamp) in ptp_clock_register()
377 ptp->info->getcrosscycles = ptp->info->getcrosststamp; in ptp_clock_register()
380 if (!ptp->info->enable) in ptp_clock_register()
381 ptp->info->enable = ptp_enable; in ptp_clock_register()
383 if (ptp->info->do_aux_work) { in ptp_clock_register()
384 kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker); in ptp_clock_register()
385 ptp->kworker = kthread_run_worker(0, "ptp%d", ptp->index); in ptp_clock_register()
386 if (IS_ERR(ptp->kworker)) { in ptp_clock_register()
387 err = PTR_ERR(ptp->kworker); in ptp_clock_register()
388 pr_err("failed to create ptp aux_worker %d\n", err); in ptp_clock_register()
393 /* PTP virtual clock is being registered under physical clock */ in ptp_clock_register()
395 strcmp(parent->class->name, "ptp") == 0) in ptp_clock_register()
396 ptp->is_virtual_clock = true; in ptp_clock_register()
398 if (!ptp->is_virtual_clock) { in ptp_clock_register()
399 ptp->max_vclocks = PTP_DEFAULT_MAX_VCLOCKS; in ptp_clock_register()
401 size = sizeof(int) * ptp->max_vclocks; in ptp_clock_register()
402 ptp->vclock_index = kzalloc(size, GFP_KERNEL); in ptp_clock_register()
403 if (!ptp->vclock_index) { in ptp_clock_register()
409 err = ptp_populate_pin_groups(ptp); in ptp_clock_register()
417 snprintf(pps.name, PPS_MAX_NAME_LEN, "ptp%d", index); in ptp_clock_register()
420 ptp->pps_source = pps_register_source(&pps, PTP_PPS_DEFAULTS); in ptp_clock_register()
421 if (IS_ERR(ptp->pps_source)) { in ptp_clock_register()
422 err = PTR_ERR(ptp->pps_source); in ptp_clock_register()
426 ptp->pps_source->lookup_cookie = ptp; in ptp_clock_register()
430 device_initialize(&ptp->dev); in ptp_clock_register()
431 ptp->dev.devt = ptp->devid; in ptp_clock_register()
432 ptp->dev.class = &ptp_class; in ptp_clock_register()
433 ptp->dev.parent = parent; in ptp_clock_register()
434 ptp->dev.groups = ptp->pin_attr_groups; in ptp_clock_register()
435 ptp->dev.release = ptp_clock_release; in ptp_clock_register()
436 dev_set_drvdata(&ptp->dev, ptp); in ptp_clock_register()
437 dev_set_name(&ptp->dev, "ptp%d", ptp->index); in ptp_clock_register()
440 err = posix_clock_register(&ptp->clock, &ptp->dev); in ptp_clock_register()
442 if (ptp->pps_source) in ptp_clock_register()
443 pps_unregister_source(ptp->pps_source); in ptp_clock_register()
445 if (ptp->kworker) in ptp_clock_register()
446 kthread_destroy_worker(ptp->kworker); in ptp_clock_register()
448 put_device(&ptp->dev); in ptp_clock_register()
455 snprintf(debugfsname, sizeof(debugfsname), "ptp%d", ptp->index); in ptp_clock_register()
456 ptp->debugfs_root = debugfs_create_dir(debugfsname, NULL); in ptp_clock_register()
458 debugfs_create_file("n_perout_loopback", 0400, ptp->debugfs_root, in ptp_clock_register()
459 ptp, &ptp_n_perout_loopback_fops); in ptp_clock_register()
460 debugfs_create_file("perout_loopback", 0200, ptp->debugfs_root, in ptp_clock_register()
461 ptp, &ptp_perout_loopback_ops); in ptp_clock_register()
464 return ptp; in ptp_clock_register()
467 ptp_cleanup_pin_groups(ptp); in ptp_clock_register()
469 kfree(ptp->vclock_index); in ptp_clock_register()
471 if (ptp->kworker) in ptp_clock_register()
472 kthread_destroy_worker(ptp->kworker); in ptp_clock_register()
474 mutex_destroy(&ptp->pincfg_mux); in ptp_clock_register()
475 mutex_destroy(&ptp->n_vclocks_mux); in ptp_clock_register()
483 kfree(ptp); in ptp_clock_register()
491 struct ptp_clock *ptp = dev_get_drvdata(dev); in unregister_vclock() local
493 ptp_vclock_unregister(info_to_vclock(ptp->info)); in unregister_vclock()
497 int ptp_clock_unregister(struct ptp_clock *ptp) in ptp_clock_unregister() argument
499 if (ptp_vclock_in_use(ptp)) { in ptp_clock_unregister()
500 device_for_each_child(&ptp->dev, NULL, unregister_vclock); in ptp_clock_unregister()
506 get_device(&ptp->dev); in ptp_clock_unregister()
509 ptp->defunct = 1; in ptp_clock_unregister()
510 wake_up_interruptible(&ptp->tsev_wq); in ptp_clock_unregister()
513 posix_clock_unregister(&ptp->clock); in ptp_clock_unregister()
516 ptp_disable_all_events(ptp); in ptp_clock_unregister()
518 if (ptp->kworker) { in ptp_clock_unregister()
519 kthread_cancel_delayed_work_sync(&ptp->aux_work); in ptp_clock_unregister()
520 kthread_destroy_worker(ptp->kworker); in ptp_clock_unregister()
524 if (ptp->pps_source) in ptp_clock_unregister()
525 pps_unregister_source(ptp->pps_source); in ptp_clock_unregister()
528 put_device(&ptp->dev); in ptp_clock_unregister()
534 void ptp_clock_event(struct ptp_clock *ptp, struct ptp_clock_event *event) in ptp_clock_event() argument
548 spin_lock_irqsave(&ptp->tsevqs_lock, flags); in ptp_clock_event()
549 list_for_each_entry(tsevq, &ptp->tsevqs, qlist) { in ptp_clock_event()
553 spin_unlock_irqrestore(&ptp->tsevqs_lock, flags); in ptp_clock_event()
554 wake_up_interruptible(&ptp->tsev_wq); in ptp_clock_event()
559 pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL); in ptp_clock_event()
563 pps_event(ptp->pps_source, &event->pps_times, in ptp_clock_event()
570 int ptp_clock_index(struct ptp_clock *ptp) in ptp_clock_index() argument
572 return ptp->index; in ptp_clock_index()
585 struct ptp_clock *ptp; in ptp_clock_index_by_of_node() local
594 ptp = dev_get_drvdata(dev); in ptp_clock_index_by_of_node()
595 phc_index = ptp_clock_index(ptp); in ptp_clock_index_by_of_node()
611 struct ptp_clock *ptp; in ptp_clock_index_by_dev() local
620 ptp = dev_get_drvdata(dev); in ptp_clock_index_by_dev()
621 phc_index = ptp_clock_index(ptp); in ptp_clock_index_by_dev()
628 int ptp_find_pin(struct ptp_clock *ptp, in ptp_find_pin() argument
634 for (i = 0; i < ptp->info->n_pins; i++) { in ptp_find_pin()
635 if (ptp->info->pin_config[i].func == func && in ptp_find_pin()
636 ptp->info->pin_config[i].chan == chan) { in ptp_find_pin()
637 pin = &ptp->info->pin_config[i]; in ptp_find_pin()
646 int ptp_find_pin_unlocked(struct ptp_clock *ptp, in ptp_find_pin_unlocked() argument
651 mutex_lock(&ptp->pincfg_mux); in ptp_find_pin_unlocked()
653 result = ptp_find_pin(ptp, func, chan); in ptp_find_pin_unlocked()
655 mutex_unlock(&ptp->pincfg_mux); in ptp_find_pin_unlocked()
661 int ptp_schedule_worker(struct ptp_clock *ptp, unsigned long delay) in ptp_schedule_worker() argument
663 return kthread_mod_delayed_work(ptp->kworker, &ptp->aux_work, delay); in ptp_schedule_worker()
667 void ptp_cancel_worker_sync(struct ptp_clock *ptp) in ptp_cancel_worker_sync() argument
669 kthread_cancel_delayed_work_sync(&ptp->aux_work); in ptp_cancel_worker_sync()
688 pr_err("ptp: failed to allocate class\n"); in ptp_init()
692 err = alloc_chrdev_region(&ptp_devt, 0, MINORMASK + 1, "ptp"); in ptp_init()
694 pr_err("ptp: failed to allocate device region\n"); in ptp_init()
698 pr_info("PTP clock support registered\n"); in ptp_init()
710 MODULE_DESCRIPTION("PTP clocks support");