• Home
  • Raw
  • Download

Lines Matching full:ptp

2  * PTP 1588 clock support
110 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); in ptp_clock_settime() local
112 return ptp->info->settime64(ptp->info, tp); in ptp_clock_settime()
117 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); in ptp_clock_gettime() local
120 err = ptp->info->gettime64(ptp->info, tp); in ptp_clock_gettime()
126 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); in ptp_clock_adjtime() local
130 ops = ptp->info; in ptp_clock_adjtime()
157 ptp->dialed_frequency = tx->freq; in ptp_clock_adjtime()
159 tx->freq = ptp->dialed_frequency; in ptp_clock_adjtime()
180 struct ptp_clock *ptp = container_of(dev, struct ptp_clock, dev); in ptp_clock_release() local
182 ptp_cleanup_pin_groups(ptp); in ptp_clock_release()
183 mutex_destroy(&ptp->tsevq_mux); in ptp_clock_release()
184 mutex_destroy(&ptp->pincfg_mux); in ptp_clock_release()
185 ida_simple_remove(&ptp_clocks_map, ptp->index); in ptp_clock_release()
186 kfree(ptp); in ptp_clock_release()
191 struct ptp_clock *ptp = container_of(work, struct ptp_clock, in ptp_aux_kworker() local
193 struct ptp_clock_info *info = ptp->info; in ptp_aux_kworker()
199 kthread_queue_delayed_work(ptp->kworker, &ptp->aux_work, delay); in ptp_aux_kworker()
207 struct ptp_clock *ptp; in ptp_clock_register() local
215 ptp = kzalloc(sizeof(struct ptp_clock), GFP_KERNEL); in ptp_clock_register()
216 if (ptp == NULL) in ptp_clock_register()
225 ptp->clock.ops = ptp_clock_ops; in ptp_clock_register()
226 ptp->info = info; in ptp_clock_register()
227 ptp->devid = MKDEV(major, index); in ptp_clock_register()
228 ptp->index = index; in ptp_clock_register()
229 spin_lock_init(&ptp->tsevq.lock); in ptp_clock_register()
230 mutex_init(&ptp->tsevq_mux); in ptp_clock_register()
231 mutex_init(&ptp->pincfg_mux); in ptp_clock_register()
232 init_waitqueue_head(&ptp->tsev_wq); in ptp_clock_register()
234 if (ptp->info->do_aux_work) { in ptp_clock_register()
235 char *worker_name = kasprintf(GFP_KERNEL, "ptp%d", ptp->index); in ptp_clock_register()
237 kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker); in ptp_clock_register()
238 ptp->kworker = kthread_create_worker(0, worker_name ? in ptp_clock_register()
241 if (IS_ERR(ptp->kworker)) { in ptp_clock_register()
242 err = PTR_ERR(ptp->kworker); in ptp_clock_register()
243 pr_err("failed to create ptp aux_worker %d\n", err); in ptp_clock_register()
248 err = ptp_populate_pin_groups(ptp); in ptp_clock_register()
256 snprintf(pps.name, PPS_MAX_NAME_LEN, "ptp%d", index); in ptp_clock_register()
259 ptp->pps_source = pps_register_source(&pps, PTP_PPS_DEFAULTS); in ptp_clock_register()
260 if (!ptp->pps_source) { in ptp_clock_register()
268 device_initialize(&ptp->dev); in ptp_clock_register()
269 ptp->dev.devt = ptp->devid; in ptp_clock_register()
270 ptp->dev.class = ptp_class; in ptp_clock_register()
271 ptp->dev.parent = parent; in ptp_clock_register()
272 ptp->dev.groups = ptp->pin_attr_groups; in ptp_clock_register()
273 ptp->dev.release = ptp_clock_release; in ptp_clock_register()
274 dev_set_drvdata(&ptp->dev, ptp); in ptp_clock_register()
275 dev_set_name(&ptp->dev, "ptp%d", ptp->index); in ptp_clock_register()
278 err = posix_clock_register(&ptp->clock, &ptp->dev); in ptp_clock_register()
284 return ptp; in ptp_clock_register()
287 if (ptp->pps_source) in ptp_clock_register()
288 pps_unregister_source(ptp->pps_source); in ptp_clock_register()
290 ptp_cleanup_pin_groups(ptp); in ptp_clock_register()
292 if (ptp->kworker) in ptp_clock_register()
293 kthread_destroy_worker(ptp->kworker); in ptp_clock_register()
295 mutex_destroy(&ptp->tsevq_mux); in ptp_clock_register()
296 mutex_destroy(&ptp->pincfg_mux); in ptp_clock_register()
299 kfree(ptp); in ptp_clock_register()
305 int ptp_clock_unregister(struct ptp_clock *ptp) in ptp_clock_unregister() argument
307 ptp->defunct = 1; in ptp_clock_unregister()
308 wake_up_interruptible(&ptp->tsev_wq); in ptp_clock_unregister()
310 if (ptp->kworker) { in ptp_clock_unregister()
311 kthread_cancel_delayed_work_sync(&ptp->aux_work); in ptp_clock_unregister()
312 kthread_destroy_worker(ptp->kworker); in ptp_clock_unregister()
316 if (ptp->pps_source) in ptp_clock_unregister()
317 pps_unregister_source(ptp->pps_source); in ptp_clock_unregister()
319 posix_clock_unregister(&ptp->clock); in ptp_clock_unregister()
325 void ptp_clock_event(struct ptp_clock *ptp, struct ptp_clock_event *event) in ptp_clock_event() argument
335 enqueue_external_timestamp(&ptp->tsevq, event); in ptp_clock_event()
336 wake_up_interruptible(&ptp->tsev_wq); in ptp_clock_event()
341 pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL); in ptp_clock_event()
345 pps_event(ptp->pps_source, &event->pps_times, in ptp_clock_event()
352 int ptp_clock_index(struct ptp_clock *ptp) in ptp_clock_index() argument
354 return ptp->index; in ptp_clock_index()
358 int ptp_find_pin(struct ptp_clock *ptp, in ptp_find_pin() argument
364 mutex_lock(&ptp->pincfg_mux); in ptp_find_pin()
365 for (i = 0; i < ptp->info->n_pins; i++) { in ptp_find_pin()
366 if (ptp->info->pin_config[i].func == func && in ptp_find_pin()
367 ptp->info->pin_config[i].chan == chan) { in ptp_find_pin()
368 pin = &ptp->info->pin_config[i]; in ptp_find_pin()
372 mutex_unlock(&ptp->pincfg_mux); in ptp_find_pin()
378 int ptp_schedule_worker(struct ptp_clock *ptp, unsigned long delay) in ptp_schedule_worker() argument
380 return kthread_mod_delayed_work(ptp->kworker, &ptp->aux_work, delay); in ptp_schedule_worker()
397 ptp_class = class_create(THIS_MODULE, "ptp"); in ptp_init()
399 pr_err("ptp: failed to allocate class\n"); in ptp_init()
403 err = alloc_chrdev_region(&ptp_devt, 0, MINORMASK + 1, "ptp"); in ptp_init()
405 pr_err("ptp: failed to allocate device region\n"); in ptp_init()
410 pr_info("PTP clock support registered\n"); in ptp_init()
422 MODULE_DESCRIPTION("PTP clocks support");