xref: /linux-6.15/include/linux/pps_kernel.h (revision eae9d2ba)
1*eae9d2baSRodolfo Giometti /*
2*eae9d2baSRodolfo Giometti  * PPS API kernel header
3*eae9d2baSRodolfo Giometti  *
4*eae9d2baSRodolfo Giometti  * Copyright (C) 2009   Rodolfo Giometti <[email protected]>
5*eae9d2baSRodolfo Giometti  *
6*eae9d2baSRodolfo Giometti  *   This program is free software; you can redistribute it and/or modify
7*eae9d2baSRodolfo Giometti  *   it under the terms of the GNU General Public License as published by
8*eae9d2baSRodolfo Giometti  *   the Free Software Foundation; either version 2 of the License, or
9*eae9d2baSRodolfo Giometti  *   (at your option) any later version.
10*eae9d2baSRodolfo Giometti  *
11*eae9d2baSRodolfo Giometti  *   This program is distributed in the hope that it will be useful,
12*eae9d2baSRodolfo Giometti  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13*eae9d2baSRodolfo Giometti  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*eae9d2baSRodolfo Giometti  *   GNU General Public License for more details.
15*eae9d2baSRodolfo Giometti  *
16*eae9d2baSRodolfo Giometti  *   You should have received a copy of the GNU General Public License
17*eae9d2baSRodolfo Giometti  *   along with this program; if not, write to the Free Software
18*eae9d2baSRodolfo Giometti  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*eae9d2baSRodolfo Giometti  */
20*eae9d2baSRodolfo Giometti 
21*eae9d2baSRodolfo Giometti #include <linux/pps.h>
22*eae9d2baSRodolfo Giometti 
23*eae9d2baSRodolfo Giometti #include <linux/cdev.h>
24*eae9d2baSRodolfo Giometti #include <linux/device.h>
25*eae9d2baSRodolfo Giometti #include <linux/time.h>
26*eae9d2baSRodolfo Giometti 
27*eae9d2baSRodolfo Giometti /*
28*eae9d2baSRodolfo Giometti  * Global defines
29*eae9d2baSRodolfo Giometti  */
30*eae9d2baSRodolfo Giometti 
31*eae9d2baSRodolfo Giometti /* The specific PPS source info */
32*eae9d2baSRodolfo Giometti struct pps_source_info {
33*eae9d2baSRodolfo Giometti 	char name[PPS_MAX_NAME_LEN];		/* simbolic name */
34*eae9d2baSRodolfo Giometti 	char path[PPS_MAX_NAME_LEN];		/* path of connected device */
35*eae9d2baSRodolfo Giometti 	int mode;				/* PPS's allowed mode */
36*eae9d2baSRodolfo Giometti 
37*eae9d2baSRodolfo Giometti 	void (*echo)(int source, int event, void *data); /* PPS echo function */
38*eae9d2baSRodolfo Giometti 
39*eae9d2baSRodolfo Giometti 	struct module *owner;
40*eae9d2baSRodolfo Giometti 	struct device *dev;
41*eae9d2baSRodolfo Giometti };
42*eae9d2baSRodolfo Giometti 
43*eae9d2baSRodolfo Giometti /* The main struct */
44*eae9d2baSRodolfo Giometti struct pps_device {
45*eae9d2baSRodolfo Giometti 	struct pps_source_info info;		/* PSS source info */
46*eae9d2baSRodolfo Giometti 
47*eae9d2baSRodolfo Giometti 	struct pps_kparams params;		/* PPS's current params */
48*eae9d2baSRodolfo Giometti 
49*eae9d2baSRodolfo Giometti 	__u32 assert_sequence;			/* PPS' assert event seq # */
50*eae9d2baSRodolfo Giometti 	__u32 clear_sequence;			/* PPS' clear event seq # */
51*eae9d2baSRodolfo Giometti 	struct pps_ktime assert_tu;
52*eae9d2baSRodolfo Giometti 	struct pps_ktime clear_tu;
53*eae9d2baSRodolfo Giometti 	int current_mode;			/* PPS mode at event time */
54*eae9d2baSRodolfo Giometti 
55*eae9d2baSRodolfo Giometti 	int go;					/* PPS event is arrived? */
56*eae9d2baSRodolfo Giometti 	wait_queue_head_t queue;		/* PPS event queue */
57*eae9d2baSRodolfo Giometti 
58*eae9d2baSRodolfo Giometti 	unsigned int id;			/* PPS source unique ID */
59*eae9d2baSRodolfo Giometti 	struct cdev cdev;
60*eae9d2baSRodolfo Giometti 	struct device *dev;
61*eae9d2baSRodolfo Giometti 	int devno;
62*eae9d2baSRodolfo Giometti 	struct fasync_struct *async_queue;	/* fasync method */
63*eae9d2baSRodolfo Giometti 	spinlock_t lock;
64*eae9d2baSRodolfo Giometti 
65*eae9d2baSRodolfo Giometti 	atomic_t usage;				/* usage count */
66*eae9d2baSRodolfo Giometti };
67*eae9d2baSRodolfo Giometti 
68*eae9d2baSRodolfo Giometti /*
69*eae9d2baSRodolfo Giometti  * Global variables
70*eae9d2baSRodolfo Giometti  */
71*eae9d2baSRodolfo Giometti 
72*eae9d2baSRodolfo Giometti extern spinlock_t pps_idr_lock;
73*eae9d2baSRodolfo Giometti extern struct idr pps_idr;
74*eae9d2baSRodolfo Giometti extern struct timespec pps_irq_ts[];
75*eae9d2baSRodolfo Giometti 
76*eae9d2baSRodolfo Giometti extern struct device_attribute pps_attrs[];
77*eae9d2baSRodolfo Giometti 
78*eae9d2baSRodolfo Giometti /*
79*eae9d2baSRodolfo Giometti  * Exported functions
80*eae9d2baSRodolfo Giometti  */
81*eae9d2baSRodolfo Giometti 
82*eae9d2baSRodolfo Giometti struct pps_device *pps_get_source(int source);
83*eae9d2baSRodolfo Giometti extern void pps_put_source(struct pps_device *pps);
84*eae9d2baSRodolfo Giometti extern int pps_register_source(struct pps_source_info *info,
85*eae9d2baSRodolfo Giometti 				int default_params);
86*eae9d2baSRodolfo Giometti extern void pps_unregister_source(int source);
87*eae9d2baSRodolfo Giometti extern int pps_register_cdev(struct pps_device *pps);
88*eae9d2baSRodolfo Giometti extern void pps_unregister_cdev(struct pps_device *pps);
89*eae9d2baSRodolfo Giometti extern void pps_event(int source, struct pps_ktime *ts, int event, void *data);
90