Lines Matching +full:pd +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * PTP 1588 clock support - character device implementation.
9 #include <linux/posix-clock.h>
34 err = ops->enable(ops, &rq, 0); in ptp_disable_pinfunc()
39 err = ops->enable(ops, &rq, 0); in ptp_disable_pinfunc()
44 return -EINVAL; in ptp_disable_pinfunc()
53 struct ptp_clock_info *info = ptp->info; in ptp_set_pinfunc()
54 struct ptp_pin_desc *pin1 = NULL, *pin2 = &info->pin_config[pin]; in ptp_set_pinfunc()
58 for (i = 0; i < info->n_pins; i++) { in ptp_set_pinfunc()
59 if (info->pin_config[i].func == func && in ptp_set_pinfunc()
60 info->pin_config[i].chan == chan) { in ptp_set_pinfunc()
61 pin1 = &info->pin_config[i]; in ptp_set_pinfunc()
73 if (chan >= info->n_ext_ts) in ptp_set_pinfunc()
74 return -EINVAL; in ptp_set_pinfunc()
77 if (chan >= info->n_per_out) in ptp_set_pinfunc()
78 return -EINVAL; in ptp_set_pinfunc()
82 return -EINVAL; in ptp_set_pinfunc()
85 return -EINVAL; in ptp_set_pinfunc()
88 if (info->verify(info, pin, func, chan)) { in ptp_set_pinfunc()
91 return -EOPNOTSUPP; in ptp_set_pinfunc()
94 /* Disable whatever function was previously assigned. */ in ptp_set_pinfunc()
97 pin1->func = PTP_PF_NONE; in ptp_set_pinfunc()
98 pin1->chan = 0; in ptp_set_pinfunc()
100 ptp_disable_pinfunc(info, pin2->func, pin2->chan); in ptp_set_pinfunc()
101 pin2->func = func; in ptp_set_pinfunc()
102 pin2->chan = chan; in ptp_set_pinfunc()
110 container_of(pccontext->clk, struct ptp_clock, clock); in ptp_open()
117 return -EINVAL; in ptp_open()
118 queue->mask = bitmap_alloc(PTP_MAX_CHANNELS, GFP_KERNEL); in ptp_open()
119 if (!queue->mask) { in ptp_open()
121 return -EINVAL; in ptp_open()
123 bitmap_set(queue->mask, 0, PTP_MAX_CHANNELS); in ptp_open()
124 spin_lock_init(&queue->lock); in ptp_open()
125 spin_lock_irqsave(&ptp->tsevqs_lock, flags); in ptp_open()
126 list_add_tail(&queue->qlist, &ptp->tsevqs); in ptp_open()
127 spin_unlock_irqrestore(&ptp->tsevqs_lock, flags); in ptp_open()
128 pccontext->private_clkdata = queue; in ptp_open()
132 queue->debugfs_instance = in ptp_open()
133 debugfs_create_dir(debugfsname, ptp->debugfs_root); in ptp_open()
134 queue->dfs_bitmap.array = (u32 *)queue->mask; in ptp_open()
135 queue->dfs_bitmap.n_elements = in ptp_open()
137 debugfs_create_u32_array("mask", 0444, queue->debugfs_instance, in ptp_open()
138 &queue->dfs_bitmap); in ptp_open()
145 struct timestamp_event_queue *queue = pccontext->private_clkdata; in ptp_release()
148 container_of(pccontext->clk, struct ptp_clock, clock); in ptp_release()
150 debugfs_remove(queue->debugfs_instance); in ptp_release()
151 pccontext->private_clkdata = NULL; in ptp_release()
152 spin_lock_irqsave(&ptp->tsevqs_lock, flags); in ptp_release()
153 list_del(&queue->qlist); in ptp_release()
154 spin_unlock_irqrestore(&ptp->tsevqs_lock, flags); in ptp_release()
155 bitmap_free(queue->mask); in ptp_release()
164 container_of(pccontext->clk, struct ptp_clock, clock); in ptp_ioctl()
168 struct ptp_clock_info *ops = ptp->info; in ptp_ioctl()
176 struct ptp_pin_desc pd; in ptp_ioctl() local
183 tsevq = pccontext->private_clkdata; in ptp_ioctl()
191 caps.max_adj = ptp->info->max_adj; in ptp_ioctl()
192 caps.n_alarm = ptp->info->n_alarm; in ptp_ioctl()
193 caps.n_ext_ts = ptp->info->n_ext_ts; in ptp_ioctl()
194 caps.n_per_out = ptp->info->n_per_out; in ptp_ioctl()
195 caps.pps = ptp->info->pps; in ptp_ioctl()
196 caps.n_pins = ptp->info->n_pins; in ptp_ioctl()
197 caps.cross_timestamping = ptp->info->getcrosststamp != NULL; in ptp_ioctl()
198 caps.adjust_phase = ptp->info->adjphase != NULL && in ptp_ioctl()
199 ptp->info->getmaxphase != NULL; in ptp_ioctl()
201 caps.max_phase_adj = ptp->info->getmaxphase(ptp->info); in ptp_ioctl()
203 err = -EFAULT; in ptp_ioctl()
212 err = -EFAULT; in ptp_ioctl()
221 err = -EINVAL; in ptp_ioctl()
227 err = -EINVAL; in ptp_ioctl()
235 if (req.extts.index >= ops->n_ext_ts) { in ptp_ioctl()
236 err = -EINVAL; in ptp_ioctl()
241 if (mutex_lock_interruptible(&ptp->pincfg_mux)) in ptp_ioctl()
242 return -ERESTARTSYS; in ptp_ioctl()
243 err = ops->enable(ops, &req, enable); in ptp_ioctl()
244 mutex_unlock(&ptp->pincfg_mux); in ptp_ioctl()
253 err = -EFAULT; in ptp_ioctl()
259 if (perout->flags & ~PTP_PEROUT_VALID_FLAGS) { in ptp_ioctl()
260 err = -EINVAL; in ptp_ioctl()
268 if (!(perout->flags & PTP_PEROUT_DUTY_CYCLE) && in ptp_ioctl()
269 (perout->rsv[0] || perout->rsv[1] || in ptp_ioctl()
270 perout->rsv[2] || perout->rsv[3])) { in ptp_ioctl()
271 err = -EINVAL; in ptp_ioctl()
274 if (perout->flags & PTP_PEROUT_DUTY_CYCLE) { in ptp_ioctl()
276 if (perout->on.sec > perout->period.sec || in ptp_ioctl()
277 (perout->on.sec == perout->period.sec && in ptp_ioctl()
278 perout->on.nsec > perout->period.nsec)) { in ptp_ioctl()
279 err = -ERANGE; in ptp_ioctl()
283 if (perout->flags & PTP_PEROUT_PHASE) { in ptp_ioctl()
289 if (perout->phase.sec > perout->period.sec || in ptp_ioctl()
290 (perout->phase.sec == perout->period.sec && in ptp_ioctl()
291 perout->phase.nsec >= perout->period.nsec)) { in ptp_ioctl()
292 err = -ERANGE; in ptp_ioctl()
303 if (req.perout.index >= ops->n_per_out) { in ptp_ioctl()
304 err = -EINVAL; in ptp_ioctl()
309 if (mutex_lock_interruptible(&ptp->pincfg_mux)) in ptp_ioctl()
310 return -ERESTARTSYS; in ptp_ioctl()
311 err = ops->enable(ops, &req, enable); in ptp_ioctl()
312 mutex_unlock(&ptp->pincfg_mux); in ptp_ioctl()
320 return -EPERM; in ptp_ioctl()
323 if (mutex_lock_interruptible(&ptp->pincfg_mux)) in ptp_ioctl()
324 return -ERESTARTSYS; in ptp_ioctl()
325 err = ops->enable(ops, &req, enable); in ptp_ioctl()
326 mutex_unlock(&ptp->pincfg_mux); in ptp_ioctl()
331 if (!ptp->info->getcrosststamp) { in ptp_ioctl()
332 err = -EOPNOTSUPP; in ptp_ioctl()
335 err = ptp->info->getcrosststamp(ptp->info, &xtstamp); in ptp_ioctl()
351 err = -EFAULT; in ptp_ioctl()
356 if (!ptp->info->gettimex64) { in ptp_ioctl()
357 err = -EOPNOTSUPP; in ptp_ioctl()
366 if (extoff->n_samples > PTP_MAX_SAMPLES || in ptp_ioctl()
367 extoff->rsv[0] || extoff->rsv[1] || in ptp_ioctl()
368 (extoff->clockid != CLOCK_REALTIME && in ptp_ioctl()
369 extoff->clockid != CLOCK_MONOTONIC && in ptp_ioctl()
370 extoff->clockid != CLOCK_MONOTONIC_RAW)) { in ptp_ioctl()
371 err = -EINVAL; in ptp_ioctl()
374 sts.clockid = extoff->clockid; in ptp_ioctl()
375 for (i = 0; i < extoff->n_samples; i++) { in ptp_ioctl()
376 err = ptp->info->gettimex64(ptp->info, &ts, &sts); in ptp_ioctl()
379 extoff->ts[i][0].sec = sts.pre_ts.tv_sec; in ptp_ioctl()
380 extoff->ts[i][0].nsec = sts.pre_ts.tv_nsec; in ptp_ioctl()
381 extoff->ts[i][1].sec = ts.tv_sec; in ptp_ioctl()
382 extoff->ts[i][1].nsec = ts.tv_nsec; in ptp_ioctl()
383 extoff->ts[i][2].sec = sts.post_ts.tv_sec; in ptp_ioctl()
384 extoff->ts[i][2].nsec = sts.post_ts.tv_nsec; in ptp_ioctl()
387 err = -EFAULT; in ptp_ioctl()
398 if (sysoff->n_samples > PTP_MAX_SAMPLES) { in ptp_ioctl()
399 err = -EINVAL; in ptp_ioctl()
402 pct = &sysoff->ts[0]; in ptp_ioctl()
403 for (i = 0; i < sysoff->n_samples; i++) { in ptp_ioctl()
405 pct->sec = ts.tv_sec; in ptp_ioctl()
406 pct->nsec = ts.tv_nsec; in ptp_ioctl()
408 if (ops->gettimex64) in ptp_ioctl()
409 err = ops->gettimex64(ops, &ts, NULL); in ptp_ioctl()
411 err = ops->gettime64(ops, &ts); in ptp_ioctl()
414 pct->sec = ts.tv_sec; in ptp_ioctl()
415 pct->nsec = ts.tv_nsec; in ptp_ioctl()
419 pct->sec = ts.tv_sec; in ptp_ioctl()
420 pct->nsec = ts.tv_nsec; in ptp_ioctl()
422 err = -EFAULT; in ptp_ioctl()
427 if (copy_from_user(&pd, (void __user *)arg, sizeof(pd))) { in ptp_ioctl()
428 err = -EFAULT; in ptp_ioctl()
431 if ((pd.rsv[0] || pd.rsv[1] || pd.rsv[2] in ptp_ioctl()
432 || pd.rsv[3] || pd.rsv[4]) in ptp_ioctl()
434 err = -EINVAL; in ptp_ioctl()
437 pd.rsv[0] = 0; in ptp_ioctl()
438 pd.rsv[1] = 0; in ptp_ioctl()
439 pd.rsv[2] = 0; in ptp_ioctl()
440 pd.rsv[3] = 0; in ptp_ioctl()
441 pd.rsv[4] = 0; in ptp_ioctl()
443 pin_index = pd.index; in ptp_ioctl()
444 if (pin_index >= ops->n_pins) { in ptp_ioctl()
445 err = -EINVAL; in ptp_ioctl()
448 pin_index = array_index_nospec(pin_index, ops->n_pins); in ptp_ioctl()
449 if (mutex_lock_interruptible(&ptp->pincfg_mux)) in ptp_ioctl()
450 return -ERESTARTSYS; in ptp_ioctl()
451 pd = ops->pin_config[pin_index]; in ptp_ioctl()
452 mutex_unlock(&ptp->pincfg_mux); in ptp_ioctl()
453 if (!err && copy_to_user((void __user *)arg, &pd, sizeof(pd))) in ptp_ioctl()
454 err = -EFAULT; in ptp_ioctl()
459 if (copy_from_user(&pd, (void __user *)arg, sizeof(pd))) { in ptp_ioctl()
460 err = -EFAULT; in ptp_ioctl()
463 if ((pd.rsv[0] || pd.rsv[1] || pd.rsv[2] in ptp_ioctl()
464 || pd.rsv[3] || pd.rsv[4]) in ptp_ioctl()
466 err = -EINVAL; in ptp_ioctl()
469 pd.rsv[0] = 0; in ptp_ioctl()
470 pd.rsv[1] = 0; in ptp_ioctl()
471 pd.rsv[2] = 0; in ptp_ioctl()
472 pd.rsv[3] = 0; in ptp_ioctl()
473 pd.rsv[4] = 0; in ptp_ioctl()
475 pin_index = pd.index; in ptp_ioctl()
476 if (pin_index >= ops->n_pins) { in ptp_ioctl()
477 err = -EINVAL; in ptp_ioctl()
480 pin_index = array_index_nospec(pin_index, ops->n_pins); in ptp_ioctl()
481 if (mutex_lock_interruptible(&ptp->pincfg_mux)) in ptp_ioctl()
482 return -ERESTARTSYS; in ptp_ioctl()
483 err = ptp_set_pinfunc(ptp, pin_index, pd.func, pd.chan); in ptp_ioctl()
484 mutex_unlock(&ptp->pincfg_mux); in ptp_ioctl()
488 bitmap_clear(tsevq->mask, 0, PTP_MAX_CHANNELS); in ptp_ioctl()
493 err = -EFAULT; in ptp_ioctl()
497 err = -EFAULT; in ptp_ioctl()
500 set_bit(i, tsevq->mask); in ptp_ioctl()
504 err = -ENOTTY; in ptp_ioctl()
518 container_of(pccontext->clk, struct ptp_clock, clock); in ptp_poll()
521 queue = pccontext->private_clkdata; in ptp_poll()
525 poll_wait(fp, &ptp->tsev_wq, wait); in ptp_poll()
536 container_of(pccontext->clk, struct ptp_clock, clock); in ptp_read()
543 queue = pccontext->private_clkdata; in ptp_read()
545 result = -EINVAL; in ptp_read()
550 result = -EINVAL; in ptp_read()
559 if (wait_event_interruptible(ptp->tsev_wq, in ptp_read()
560 ptp->defunct || queue_cnt(queue))) { in ptp_read()
561 return -ERESTARTSYS; in ptp_read()
564 if (ptp->defunct) { in ptp_read()
565 result = -ENODEV; in ptp_read()
571 result = -ENOMEM; in ptp_read()
575 spin_lock_irqsave(&queue->lock, flags); in ptp_read()
583 event[i] = queue->buf[queue->head]; in ptp_read()
585 WRITE_ONCE(queue->head, (queue->head + 1) % PTP_MAX_TIMESTAMPS); in ptp_read()
588 spin_unlock_irqrestore(&queue->lock, flags); in ptp_read()
594 result = -EFAULT; in ptp_read()