1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * PTP 1588 clock support - private declarations for the core module.
5 * Copyright (C) 2010 OMICRON electronics GmbH
7 #ifndef _PTP_PRIVATE_H_
8 #define _PTP_PRIVATE_H_
10 #include <linux/cdev.h>
11 #include <linux/device.h>
12 #include <linux/kthread.h>
13 #include <linux/mutex.h>
14 #include <linux/posix-clock.h>
15 #include <linux/ptp_clock.h>
16 #include <linux/ptp_clock_kernel.h>
17 #include <linux/time.h>
18 #include <linux/list.h>
19 #include <linux/bitmap.h>
20 #include <linux/debugfs.h>
22 #define PTP_MAX_TIMESTAMPS 128
23 #define PTP_BUF_TIMESTAMPS 30
24 #define PTP_DEFAULT_MAX_VCLOCKS 20
25 #define PTP_MAX_CHANNELS 2048
27 struct timestamp_event_queue
{
28 struct ptp_extts_event buf
[PTP_MAX_TIMESTAMPS
];
32 struct list_head qlist
;
34 struct dentry
*debugfs_instance
;
35 struct debugfs_u32_array dfs_bitmap
;
39 struct posix_clock clock
;
41 struct ptp_clock_info
*info
;
43 int index
; /* index into clocks.map */
44 struct pps_device
*pps_source
;
45 long dialed_frequency
; /* remembers the frequency adjustment */
46 struct list_head tsevqs
; /* timestamp fifo list */
47 spinlock_t tsevqs_lock
; /* protects tsevqs from concurrent access */
48 struct mutex pincfg_mux
; /* protect concurrent info->pin_config access */
49 wait_queue_head_t tsev_wq
;
50 int defunct
; /* tells readers to go away when clock is being removed */
51 struct device_attribute
*pin_dev_attr
;
52 struct attribute
**pin_attr
;
53 struct attribute_group pin_attr_group
;
54 /* 1st entry is a pointer to the real group, 2nd is NULL terminator */
55 const struct attribute_group
*pin_attr_groups
[2];
56 struct kthread_worker
*kworker
;
57 struct kthread_delayed_work aux_work
;
58 unsigned int max_vclocks
;
59 unsigned int n_vclocks
;
61 struct mutex n_vclocks_mux
; /* protect concurrent n_vclocks access */
62 bool is_virtual_clock
;
64 struct dentry
*debugfs_root
;
67 #define info_to_vclock(d) container_of((d), struct ptp_vclock, info)
68 #define cc_to_vclock(d) container_of((d), struct ptp_vclock, cc)
69 #define dw_to_vclock(d) container_of((d), struct ptp_vclock, refresh_work)
72 struct ptp_clock
*pclock
;
73 struct ptp_clock_info info
;
74 struct ptp_clock
*clock
;
75 struct hlist_node vclock_hash_node
;
76 struct cyclecounter cc
;
77 struct timecounter tc
;
78 struct mutex lock
; /* protects tc/cc */
82 * The function queue_cnt() is safe for readers to call without
83 * holding q->lock. Readers use this function to verify that the queue
84 * is nonempty before proceeding with a dequeue operation. The fact
85 * that a writer might concurrently increment the tail does not
86 * matter, since the queue remains nonempty nonetheless.
88 static inline int queue_cnt(const struct timestamp_event_queue
*q
)
91 * Paired with WRITE_ONCE() in enqueue_external_timestamp(),
92 * ptp_read(), extts_fifo_show().
94 int cnt
= READ_ONCE(q
->tail
) - READ_ONCE(q
->head
);
95 return cnt
< 0 ? PTP_MAX_TIMESTAMPS
+ cnt
: cnt
;
98 /* Check if ptp virtual clock is in use */
99 static inline bool ptp_vclock_in_use(struct ptp_clock
*ptp
)
103 if (mutex_lock_interruptible(&ptp
->n_vclocks_mux
))
106 if (!ptp
->is_virtual_clock
&& ptp
->n_vclocks
)
109 mutex_unlock(&ptp
->n_vclocks_mux
);
114 /* Check if ptp clock shall be free running */
115 static inline bool ptp_clock_freerun(struct ptp_clock
*ptp
)
120 return ptp_vclock_in_use(ptp
);
123 extern const struct class ptp_class
;
129 /* caller must hold pincfg_mux */
130 int ptp_set_pinfunc(struct ptp_clock
*ptp
, unsigned int pin
,
131 enum ptp_pin_function func
, unsigned int chan
);
133 long ptp_ioctl(struct posix_clock_context
*pccontext
, unsigned int cmd
,
136 int ptp_open(struct posix_clock_context
*pccontext
, fmode_t fmode
);
138 int ptp_release(struct posix_clock_context
*pccontext
);
140 ssize_t
ptp_read(struct posix_clock_context
*pccontext
, uint flags
, char __user
*buf
,
143 __poll_t
ptp_poll(struct posix_clock_context
*pccontext
, struct file
*fp
,
150 extern const struct attribute_group
*ptp_groups
[];
152 int ptp_populate_pin_groups(struct ptp_clock
*ptp
);
153 void ptp_cleanup_pin_groups(struct ptp_clock
*ptp
);
155 struct ptp_vclock
*ptp_vclock_register(struct ptp_clock
*pclock
);
156 void ptp_vclock_unregister(struct ptp_vclock
*vclock
);