• Home
  • Raw
  • Download

Lines Matching +full:tx +full:- +full:freq

1 // SPDX-License-Identifier: GPL-2.0-or-later
13 #include <linux/posix-clock.h>
38 return PTP_MAX_TIMESTAMPS - queue_cnt(q) - 1; in queue_free()
49 seconds = div_u64_rem(src->timestamp, 1000000000, &remainder); in enqueue_external_timestamp()
51 spin_lock_irqsave(&queue->lock, flags); in enqueue_external_timestamp()
53 dst = &queue->buf[queue->tail]; in enqueue_external_timestamp()
54 dst->index = src->index; in enqueue_external_timestamp()
55 dst->t.sec = seconds; in enqueue_external_timestamp()
56 dst->t.nsec = remainder; in enqueue_external_timestamp()
60 WRITE_ONCE(queue->head, (queue->head + 1) % PTP_MAX_TIMESTAMPS); in enqueue_external_timestamp()
62 WRITE_ONCE(queue->tail, (queue->tail + 1) % PTP_MAX_TIMESTAMPS); in enqueue_external_timestamp()
64 spin_unlock_irqrestore(&queue->lock, flags); in enqueue_external_timestamp()
70 * The 'freq' field in the 'struct timex' is in parts per in scaled_ppm_to_ppb()
92 tp->tv_sec = 0; in ptp_clock_getres()
93 tp->tv_nsec = 1; in ptp_clock_getres()
101 return ptp->info->settime64(ptp->info, tp); in ptp_clock_settime()
109 if (ptp->info->gettimex64) in ptp_clock_gettime()
110 err = ptp->info->gettimex64(ptp->info, tp, NULL); in ptp_clock_gettime()
112 err = ptp->info->gettime64(ptp->info, tp); in ptp_clock_gettime()
116 static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx) in ptp_clock_adjtime() argument
120 int err = -EOPNOTSUPP; in ptp_clock_adjtime()
122 ops = ptp->info; in ptp_clock_adjtime()
124 if (tx->modes & ADJ_SETOFFSET) { in ptp_clock_adjtime()
129 ts.tv_sec = tx->time.tv_sec; in ptp_clock_adjtime()
130 ts.tv_nsec = tx->time.tv_usec; in ptp_clock_adjtime()
132 if (!(tx->modes & ADJ_NANO)) in ptp_clock_adjtime()
136 return -EINVAL; in ptp_clock_adjtime()
140 err = ops->adjtime(ops, delta); in ptp_clock_adjtime()
141 } else if (tx->modes & ADJ_FREQUENCY) { in ptp_clock_adjtime()
142 long ppb = scaled_ppm_to_ppb(tx->freq); in ptp_clock_adjtime()
143 if (ppb > ops->max_adj || ppb < -ops->max_adj) in ptp_clock_adjtime()
144 return -ERANGE; in ptp_clock_adjtime()
145 if (ops->adjfine) in ptp_clock_adjtime()
146 err = ops->adjfine(ops, tx->freq); in ptp_clock_adjtime()
148 err = ops->adjfreq(ops, ppb); in ptp_clock_adjtime()
149 ptp->dialed_frequency = tx->freq; in ptp_clock_adjtime()
150 } else if (tx->modes & ADJ_OFFSET) { in ptp_clock_adjtime()
151 if (ops->adjphase) { in ptp_clock_adjtime()
152 s32 offset = tx->offset; in ptp_clock_adjtime()
154 if (!(tx->modes & ADJ_NANO)) in ptp_clock_adjtime()
157 err = ops->adjphase(ops, offset); in ptp_clock_adjtime()
159 } else if (tx->modes == 0) { in ptp_clock_adjtime()
160 tx->freq = ptp->dialed_frequency; in ptp_clock_adjtime()
184 mutex_destroy(&ptp->tsevq_mux); in ptp_clock_release()
185 mutex_destroy(&ptp->pincfg_mux); in ptp_clock_release()
186 ida_simple_remove(&ptp_clocks_map, ptp->index); in ptp_clock_release()
192 return -EOPNOTSUPP; in ptp_enable()
199 struct ptp_clock_info *info = ptp->info; in ptp_aux_kworker()
202 delay = info->do_aux_work(info); in ptp_aux_kworker()
205 kthread_queue_delayed_work(ptp->kworker, &ptp->aux_work, delay); in ptp_aux_kworker()
216 if (info->n_alarm > PTP_MAX_ALARMS) in ptp_clock_register()
217 return ERR_PTR(-EINVAL); in ptp_clock_register()
220 err = -ENOMEM; in ptp_clock_register()
231 ptp->clock.ops = ptp_clock_ops; in ptp_clock_register()
232 ptp->info = info; in ptp_clock_register()
233 ptp->devid = MKDEV(major, index); in ptp_clock_register()
234 ptp->index = index; in ptp_clock_register()
235 spin_lock_init(&ptp->tsevq.lock); in ptp_clock_register()
236 mutex_init(&ptp->tsevq_mux); in ptp_clock_register()
237 mutex_init(&ptp->pincfg_mux); in ptp_clock_register()
238 init_waitqueue_head(&ptp->tsev_wq); in ptp_clock_register()
240 if (!ptp->info->enable) in ptp_clock_register()
241 ptp->info->enable = ptp_enable; in ptp_clock_register()
243 if (ptp->info->do_aux_work) { in ptp_clock_register()
244 kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker); in ptp_clock_register()
245 ptp->kworker = kthread_create_worker(0, "ptp%d", ptp->index); in ptp_clock_register()
246 if (IS_ERR(ptp->kworker)) { in ptp_clock_register()
247 err = PTR_ERR(ptp->kworker); in ptp_clock_register()
258 if (info->pps) { in ptp_clock_register()
263 pps.owner = info->owner; in ptp_clock_register()
264 ptp->pps_source = pps_register_source(&pps, PTP_PPS_DEFAULTS); in ptp_clock_register()
265 if (IS_ERR(ptp->pps_source)) { in ptp_clock_register()
266 err = PTR_ERR(ptp->pps_source); in ptp_clock_register()
273 device_initialize(&ptp->dev); in ptp_clock_register()
274 ptp->dev.devt = ptp->devid; in ptp_clock_register()
275 ptp->dev.class = ptp_class; in ptp_clock_register()
276 ptp->dev.parent = parent; in ptp_clock_register()
277 ptp->dev.groups = ptp->pin_attr_groups; in ptp_clock_register()
278 ptp->dev.release = ptp_clock_release; in ptp_clock_register()
279 dev_set_drvdata(&ptp->dev, ptp); in ptp_clock_register()
280 dev_set_name(&ptp->dev, "ptp%d", ptp->index); in ptp_clock_register()
283 err = posix_clock_register(&ptp->clock, &ptp->dev); in ptp_clock_register()
292 if (ptp->pps_source) in ptp_clock_register()
293 pps_unregister_source(ptp->pps_source); in ptp_clock_register()
297 if (ptp->kworker) in ptp_clock_register()
298 kthread_destroy_worker(ptp->kworker); in ptp_clock_register()
300 mutex_destroy(&ptp->tsevq_mux); in ptp_clock_register()
301 mutex_destroy(&ptp->pincfg_mux); in ptp_clock_register()
312 ptp->defunct = 1; in ptp_clock_unregister()
313 wake_up_interruptible(&ptp->tsev_wq); in ptp_clock_unregister()
315 if (ptp->kworker) { in ptp_clock_unregister()
316 kthread_cancel_delayed_work_sync(&ptp->aux_work); in ptp_clock_unregister()
317 kthread_destroy_worker(ptp->kworker); in ptp_clock_unregister()
321 if (ptp->pps_source) in ptp_clock_unregister()
322 pps_unregister_source(ptp->pps_source); in ptp_clock_unregister()
324 posix_clock_unregister(&ptp->clock); in ptp_clock_unregister()
334 switch (event->type) { in ptp_clock_event()
340 enqueue_external_timestamp(&ptp->tsevq, event); in ptp_clock_event()
341 wake_up_interruptible(&ptp->tsev_wq); in ptp_clock_event()
346 pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL); in ptp_clock_event()
350 pps_event(ptp->pps_source, &event->pps_times, in ptp_clock_event()
359 return ptp->index; in ptp_clock_index()
369 for (i = 0; i < ptp->info->n_pins; i++) { in ptp_find_pin()
370 if (ptp->info->pin_config[i].func == func && in ptp_find_pin()
371 ptp->info->pin_config[i].chan == chan) { in ptp_find_pin()
372 pin = &ptp->info->pin_config[i]; in ptp_find_pin()
377 return pin ? i : -1; in ptp_find_pin()
386 mutex_lock(&ptp->pincfg_mux); in ptp_find_pin_unlocked()
390 mutex_unlock(&ptp->pincfg_mux); in ptp_find_pin_unlocked()
398 return kthread_mod_delayed_work(ptp->kworker, &ptp->aux_work, delay); in ptp_schedule_worker()
404 kthread_cancel_delayed_work_sync(&ptp->aux_work); in ptp_cancel_worker_sync()
433 ptp_class->dev_groups = ptp_groups; in ptp_init()