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