xref: /linux-6.15/include/linux/pps_gen_kernel.h (revision 86b525be)
1*86b525beSRodolfo Giometti /* SPDX-License-Identifier: GPL-2.0-or-later */
2*86b525beSRodolfo Giometti /*
3*86b525beSRodolfo Giometti  * PPS generator API kernel header
4*86b525beSRodolfo Giometti  *
5*86b525beSRodolfo Giometti  * Copyright (C) 2024 Rodolfo Giometti <[email protected]>
6*86b525beSRodolfo Giometti  */
7*86b525beSRodolfo Giometti 
8*86b525beSRodolfo Giometti #ifndef LINUX_PPS_GEN_KERNEL_H
9*86b525beSRodolfo Giometti #define LINUX_PPS_GEN_KERNEL_H
10*86b525beSRodolfo Giometti 
11*86b525beSRodolfo Giometti #include <linux/pps_gen.h>
12*86b525beSRodolfo Giometti #include <linux/cdev.h>
13*86b525beSRodolfo Giometti #include <linux/device.h>
14*86b525beSRodolfo Giometti 
15*86b525beSRodolfo Giometti /*
16*86b525beSRodolfo Giometti  * Global defines
17*86b525beSRodolfo Giometti  */
18*86b525beSRodolfo Giometti 
19*86b525beSRodolfo Giometti #define PPS_GEN_MAX_SOURCES	16		/* should be enough... */
20*86b525beSRodolfo Giometti 
21*86b525beSRodolfo Giometti struct pps_gen_device;
22*86b525beSRodolfo Giometti 
23*86b525beSRodolfo Giometti /**
24*86b525beSRodolfo Giometti  * struct pps_gen_source_info - the specific PPS generator info
25*86b525beSRodolfo Giometti  * @use_system_clock: true, if the system clock is used to generate pulses
26*86b525beSRodolfo Giometti  * @get_time: query the time stored into the generator clock
27*86b525beSRodolfo Giometti  * @enable: enable/disable the PPS pulses generation
28*86b525beSRodolfo Giometti  *
29*86b525beSRodolfo Giometti  * This is the main generator struct where all needed information must be
30*86b525beSRodolfo Giometti  * placed before calling the pps_gen_register_source().
31*86b525beSRodolfo Giometti  */
32*86b525beSRodolfo Giometti struct pps_gen_source_info {
33*86b525beSRodolfo Giometti 	bool use_system_clock;
34*86b525beSRodolfo Giometti 
35*86b525beSRodolfo Giometti 	int (*get_time)(struct pps_gen_device *pps_gen,
36*86b525beSRodolfo Giometti 					struct timespec64 *time);
37*86b525beSRodolfo Giometti 	int (*enable)(struct pps_gen_device *pps_gen, bool enable);
38*86b525beSRodolfo Giometti 
39*86b525beSRodolfo Giometti /* private: internal use only */
40*86b525beSRodolfo Giometti 	struct module *owner;
41*86b525beSRodolfo Giometti 	struct device *parent;			/* for device_create */
42*86b525beSRodolfo Giometti };
43*86b525beSRodolfo Giometti 
44*86b525beSRodolfo Giometti /* The main struct */
45*86b525beSRodolfo Giometti struct pps_gen_device {
46*86b525beSRodolfo Giometti 	struct pps_gen_source_info info;	/* PSS generator info */
47*86b525beSRodolfo Giometti 	bool enabled;				/* PSS generator status */
48*86b525beSRodolfo Giometti 
49*86b525beSRodolfo Giometti 	unsigned int event;
50*86b525beSRodolfo Giometti 	unsigned int sequence;
51*86b525beSRodolfo Giometti 
52*86b525beSRodolfo Giometti 	unsigned int last_ev;			/* last PPS event id */
53*86b525beSRodolfo Giometti 	wait_queue_head_t queue;		/* PPS event queue */
54*86b525beSRodolfo Giometti 
55*86b525beSRodolfo Giometti 	unsigned int id;			/* PPS generator unique ID */
56*86b525beSRodolfo Giometti 	struct cdev cdev;
57*86b525beSRodolfo Giometti 	struct device *dev;
58*86b525beSRodolfo Giometti 	struct fasync_struct *async_queue;	/* fasync method */
59*86b525beSRodolfo Giometti 	spinlock_t lock;
60*86b525beSRodolfo Giometti };
61*86b525beSRodolfo Giometti 
62*86b525beSRodolfo Giometti /*
63*86b525beSRodolfo Giometti  * Global variables
64*86b525beSRodolfo Giometti  */
65*86b525beSRodolfo Giometti 
66*86b525beSRodolfo Giometti extern const struct attribute_group *pps_gen_groups[];
67*86b525beSRodolfo Giometti 
68*86b525beSRodolfo Giometti /*
69*86b525beSRodolfo Giometti  * Exported functions
70*86b525beSRodolfo Giometti  */
71*86b525beSRodolfo Giometti 
72*86b525beSRodolfo Giometti extern struct pps_gen_device *pps_gen_register_source(
73*86b525beSRodolfo Giometti 				struct pps_gen_source_info *info);
74*86b525beSRodolfo Giometti extern void pps_gen_unregister_source(struct pps_gen_device *pps_gen);
75*86b525beSRodolfo Giometti extern void pps_gen_event(struct pps_gen_device *pps_gen,
76*86b525beSRodolfo Giometti 				unsigned int event, void *data);
77*86b525beSRodolfo Giometti 
78*86b525beSRodolfo Giometti #endif /* LINUX_PPS_GEN_KERNEL_H */
79