1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * PTP 1588 clock support 4 * 5 * Copyright (C) 2010 OMICRON electronics GmbH 6 */ 7#include <linux/idr.h> 8#include <linux/device.h> 9#include <linux/err.h> 10#include <linux/init.h> 11#include <linux/kernel.h> 12#include <linux/module.h> 13#include <linux/posix-clock.h> 14#include <linux/pps_kernel.h> 15#include <linux/slab.h> 16#include <linux/syscalls.h> 17#include <linux/uaccess.h> 18#include <uapi/linux/sched/types.h> 19 20#include "ptp_private.h" 21 22#define PTP_MAX_ALARMS 4 23#define PTP_PPS_DEFAULTS (PPS_CAPTUREASSERT | PPS_OFFSETASSERT) 24#define PTP_PPS_EVENT PPS_CAPTUREASSERT 25#define PTP_PPS_MODE (PTP_PPS_DEFAULTS | PPS_CANWAIT | PPS_TSFMT_TSPEC) 26 27/* private globals */ 28 29static dev_t ptp_devt; 30static struct class *ptp_class; 31 32static DEFINE_IDA(ptp_clocks_map); 33 34/* time stamp event queue operations */ 35 36static inline int queue_free(struct timestamp_event_queue *q) 37{ 38 return PTP_MAX_TIMESTAMPS - queue_cnt(q) - 1; 39} 40 41static void enqueue_external_timestamp(struct timestamp_event_queue *queue, 42 struct ptp_clock_event *src) 43{ 44 struct ptp_extts_event *dst; 45 unsigned long flags; 46 s64 seconds; 47 u32 remainder; 48 49 seconds = div_u64_rem(src->timestamp, 1000000000, &remainder); 50 51 spin_lock_irqsave(&queue->lock, flags); 52 53 dst = &queue->buf[queue->tail]; 54 dst->index = src->index; 55 dst->t.sec = seconds; 56 dst->t.nsec = remainder; 57 58 /* Both WRITE_ONCE() are paired with READ_ONCE() in queue_cnt() */ 59 if (!queue_free(queue)) 60 WRITE_ONCE(queue->head, (queue->head + 1) % PTP_MAX_TIMESTAMPS); 61 62 WRITE_ONCE(queue->tail, (queue->tail + 1) % PTP_MAX_TIMESTAMPS); 63 64 spin_unlock_irqrestore(&queue->lock, flags); 65} 66 67long scaled_ppm_to_ppb(long ppm) 68{ 69 /* 70 * The 'freq' field in the 'struct timex' is in parts per 71 * million, but with a 16 bit binary fractional field. 72 * 73 * We want to calculate 74 * 75 * ppb = scaled_ppm * 1000 / 2^16 76 * 77 * which simplifies to 78 * 79 * ppb = scaled_ppm * 125 / 2^13 80 */ 81 s64 ppb = 1 + ppm; 82 ppb *= 125; 83 ppb >>= 13; 84 return (long) ppb; 85} 86EXPORT_SYMBOL(scaled_ppm_to_ppb); 87 88/* posix clock implementation */ 89 90static int ptp_clock_getres(struct posix_clock *pc, struct timespec64 *tp) 91{ 92 tp->tv_sec = 0; 93 tp->tv_nsec = 1; 94 return 0; 95} 96 97static int ptp_clock_settime(struct posix_clock *pc, const struct timespec64 *tp) 98{ 99 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); 100 101 return ptp->info->settime64(ptp->info, tp); 102} 103 104static int ptp_clock_gettime(struct posix_clock *pc, struct timespec64 *tp) 105{ 106 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); 107 int err; 108 109 if (ptp->info->gettimex64) 110 err = ptp->info->gettimex64(ptp->info, tp, NULL); 111 else 112 err = ptp->info->gettime64(ptp->info, tp); 113 return err; 114} 115 116static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx) 117{ 118 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); 119 struct ptp_clock_info *ops; 120 int err = -EOPNOTSUPP; 121 122 ops = ptp->info; 123 124 if (tx->modes & ADJ_SETOFFSET) { 125 struct timespec64 ts; 126 ktime_t kt; 127 s64 delta; 128 129 ts.tv_sec = tx->time.tv_sec; 130 ts.tv_nsec = tx->time.tv_usec; 131 132 if (!(tx->modes & ADJ_NANO)) 133 ts.tv_nsec *= 1000; 134 135 if ((unsigned long) ts.tv_nsec >= NSEC_PER_SEC) 136 return -EINVAL; 137 138 kt = timespec64_to_ktime(ts); 139 delta = ktime_to_ns(kt); 140 err = ops->adjtime(ops, delta); 141 } else if (tx->modes & ADJ_FREQUENCY) { 142 long ppb = scaled_ppm_to_ppb(tx->freq); 143 if (ppb > ops->max_adj || ppb < -ops->max_adj) 144 return -ERANGE; 145 if (ops->adjfine) 146 err = ops->adjfine(ops, tx->freq); 147 else 148 err = ops->adjfreq(ops, ppb); 149 ptp->dialed_frequency = tx->freq; 150 } else if (tx->modes & ADJ_OFFSET) { 151 if (ops->adjphase) { 152 s32 offset = tx->offset; 153 154 if (!(tx->modes & ADJ_NANO)) 155 offset *= NSEC_PER_USEC; 156 157 err = ops->adjphase(ops, offset); 158 } 159 } else if (tx->modes == 0) { 160 tx->freq = ptp->dialed_frequency; 161 err = 0; 162 } 163 164 return err; 165} 166 167static struct posix_clock_operations ptp_clock_ops = { 168 .owner = THIS_MODULE, 169 .clock_adjtime = ptp_clock_adjtime, 170 .clock_gettime = ptp_clock_gettime, 171 .clock_getres = ptp_clock_getres, 172 .clock_settime = ptp_clock_settime, 173 .ioctl = ptp_ioctl, 174 .open = ptp_open, 175 .poll = ptp_poll, 176 .read = ptp_read, 177}; 178 179static void ptp_clock_release(struct device *dev) 180{ 181 struct ptp_clock *ptp = container_of(dev, struct ptp_clock, dev); 182 183 ptp_cleanup_pin_groups(ptp); 184 mutex_destroy(&ptp->tsevq_mux); 185 mutex_destroy(&ptp->pincfg_mux); 186 ida_simple_remove(&ptp_clocks_map, ptp->index); 187 kfree(ptp); 188} 189 190static void ptp_aux_kworker(struct kthread_work *work) 191{ 192 struct ptp_clock *ptp = container_of(work, struct ptp_clock, 193 aux_work.work); 194 struct ptp_clock_info *info = ptp->info; 195 long delay; 196 197 delay = info->do_aux_work(info); 198 199 if (delay >= 0) 200 kthread_queue_delayed_work(ptp->kworker, &ptp->aux_work, delay); 201} 202 203/* public interface */ 204 205struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info, 206 struct device *parent) 207{ 208 struct ptp_clock *ptp; 209 int err = 0, index, major = MAJOR(ptp_devt); 210 211 if (info->n_alarm > PTP_MAX_ALARMS) 212 return ERR_PTR(-EINVAL); 213 214 /* Initialize a clock structure. */ 215 err = -ENOMEM; 216 ptp = kzalloc(sizeof(struct ptp_clock), GFP_KERNEL); 217 if (ptp == NULL) 218 goto no_memory; 219 220 index = ida_simple_get(&ptp_clocks_map, 0, MINORMASK + 1, GFP_KERNEL); 221 if (index < 0) { 222 err = index; 223 goto no_slot; 224 } 225 226 ptp->clock.ops = ptp_clock_ops; 227 ptp->info = info; 228 ptp->devid = MKDEV(major, index); 229 ptp->index = index; 230 spin_lock_init(&ptp->tsevq.lock); 231 mutex_init(&ptp->tsevq_mux); 232 mutex_init(&ptp->pincfg_mux); 233 init_waitqueue_head(&ptp->tsev_wq); 234 235 if (ptp->info->do_aux_work) { 236 kthread_init_delayed_work(&ptp->aux_work, ptp_aux_kworker); 237 ptp->kworker = kthread_create_worker(0, "ptp%d", ptp->index); 238 if (IS_ERR(ptp->kworker)) { 239 err = PTR_ERR(ptp->kworker); 240 pr_err("failed to create ptp aux_worker %d\n", err); 241 goto kworker_err; 242 } 243 } 244 245 err = ptp_populate_pin_groups(ptp); 246 if (err) 247 goto no_pin_groups; 248 249 /* Register a new PPS source. */ 250 if (info->pps) { 251 struct pps_source_info pps; 252 memset(&pps, 0, sizeof(pps)); 253 snprintf(pps.name, PPS_MAX_NAME_LEN, "ptp%d", index); 254 pps.mode = PTP_PPS_MODE; 255 pps.owner = info->owner; 256 ptp->pps_source = pps_register_source(&pps, PTP_PPS_DEFAULTS); 257 if (IS_ERR(ptp->pps_source)) { 258 err = PTR_ERR(ptp->pps_source); 259 pr_err("failed to register pps source\n"); 260 goto no_pps; 261 } 262 } 263 264 /* Initialize a new device of our class in our clock structure. */ 265 device_initialize(&ptp->dev); 266 ptp->dev.devt = ptp->devid; 267 ptp->dev.class = ptp_class; 268 ptp->dev.parent = parent; 269 ptp->dev.groups = ptp->pin_attr_groups; 270 ptp->dev.release = ptp_clock_release; 271 dev_set_drvdata(&ptp->dev, ptp); 272 dev_set_name(&ptp->dev, "ptp%d", ptp->index); 273 274 /* Create a posix clock and link it to the device. */ 275 err = posix_clock_register(&ptp->clock, &ptp->dev); 276 if (err) { 277 pr_err("failed to create posix clock\n"); 278 goto no_clock; 279 } 280 281 return ptp; 282 283no_clock: 284 if (ptp->pps_source) 285 pps_unregister_source(ptp->pps_source); 286no_pps: 287 ptp_cleanup_pin_groups(ptp); 288no_pin_groups: 289 if (ptp->kworker) 290 kthread_destroy_worker(ptp->kworker); 291kworker_err: 292 mutex_destroy(&ptp->tsevq_mux); 293 mutex_destroy(&ptp->pincfg_mux); 294 ida_simple_remove(&ptp_clocks_map, index); 295no_slot: 296 kfree(ptp); 297no_memory: 298 return ERR_PTR(err); 299} 300EXPORT_SYMBOL(ptp_clock_register); 301 302int ptp_clock_unregister(struct ptp_clock *ptp) 303{ 304 ptp->defunct = 1; 305 wake_up_interruptible(&ptp->tsev_wq); 306 307 if (ptp->kworker) { 308 kthread_cancel_delayed_work_sync(&ptp->aux_work); 309 kthread_destroy_worker(ptp->kworker); 310 } 311 312 /* Release the clock's resources. */ 313 if (ptp->pps_source) 314 pps_unregister_source(ptp->pps_source); 315 316 posix_clock_unregister(&ptp->clock); 317 318 return 0; 319} 320EXPORT_SYMBOL(ptp_clock_unregister); 321 322void ptp_clock_event(struct ptp_clock *ptp, struct ptp_clock_event *event) 323{ 324 struct pps_event_time evt; 325 326 switch (event->type) { 327 328 case PTP_CLOCK_ALARM: 329 break; 330 331 case PTP_CLOCK_EXTTS: 332 enqueue_external_timestamp(&ptp->tsevq, event); 333 wake_up_interruptible(&ptp->tsev_wq); 334 break; 335 336 case PTP_CLOCK_PPS: 337 pps_get_ts(&evt); 338 pps_event(ptp->pps_source, &evt, PTP_PPS_EVENT, NULL); 339 break; 340 341 case PTP_CLOCK_PPSUSR: 342 pps_event(ptp->pps_source, &event->pps_times, 343 PTP_PPS_EVENT, NULL); 344 break; 345 } 346} 347EXPORT_SYMBOL(ptp_clock_event); 348 349int ptp_clock_index(struct ptp_clock *ptp) 350{ 351 return ptp->index; 352} 353EXPORT_SYMBOL(ptp_clock_index); 354 355int ptp_find_pin(struct ptp_clock *ptp, 356 enum ptp_pin_function func, unsigned int chan) 357{ 358 struct ptp_pin_desc *pin = NULL; 359 int i; 360 361 for (i = 0; i < ptp->info->n_pins; i++) { 362 if (ptp->info->pin_config[i].func == func && 363 ptp->info->pin_config[i].chan == chan) { 364 pin = &ptp->info->pin_config[i]; 365 break; 366 } 367 } 368 369 return pin ? i : -1; 370} 371EXPORT_SYMBOL(ptp_find_pin); 372 373int ptp_find_pin_unlocked(struct ptp_clock *ptp, 374 enum ptp_pin_function func, unsigned int chan) 375{ 376 int result; 377 378 mutex_lock(&ptp->pincfg_mux); 379 380 result = ptp_find_pin(ptp, func, chan); 381 382 mutex_unlock(&ptp->pincfg_mux); 383 384 return result; 385} 386EXPORT_SYMBOL(ptp_find_pin_unlocked); 387 388int ptp_schedule_worker(struct ptp_clock *ptp, unsigned long delay) 389{ 390 return kthread_mod_delayed_work(ptp->kworker, &ptp->aux_work, delay); 391} 392EXPORT_SYMBOL(ptp_schedule_worker); 393 394void ptp_cancel_worker_sync(struct ptp_clock *ptp) 395{ 396 kthread_cancel_delayed_work_sync(&ptp->aux_work); 397} 398EXPORT_SYMBOL(ptp_cancel_worker_sync); 399 400/* module operations */ 401 402static void __exit ptp_exit(void) 403{ 404 class_destroy(ptp_class); 405 unregister_chrdev_region(ptp_devt, MINORMASK + 1); 406 ida_destroy(&ptp_clocks_map); 407} 408 409static int __init ptp_init(void) 410{ 411 int err; 412 413 ptp_class = class_create(THIS_MODULE, "ptp"); 414 if (IS_ERR(ptp_class)) { 415 pr_err("ptp: failed to allocate class\n"); 416 return PTR_ERR(ptp_class); 417 } 418 419 err = alloc_chrdev_region(&ptp_devt, 0, MINORMASK + 1, "ptp"); 420 if (err < 0) { 421 pr_err("ptp: failed to allocate device region\n"); 422 goto no_region; 423 } 424 425 ptp_class->dev_groups = ptp_groups; 426 pr_info("PTP clock support registered\n"); 427 return 0; 428 429no_region: 430 class_destroy(ptp_class); 431 return err; 432} 433 434subsys_initcall(ptp_init); 435module_exit(ptp_exit); 436 437MODULE_AUTHOR("Richard Cochran <richardcochran@gmail.com>"); 438MODULE_DESCRIPTION("PTP clocks support"); 439MODULE_LICENSE("GPL"); 440