mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
![Thomas Gleixner](/assets/img/avatar_default.png)
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not write to the free software foundation inc 675 mass ave cambridge ma 02139 usa extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 441 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc) Reviewed-by: Richard Fontana <rfontana@redhat.com> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190520071858.739733335@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
120 lines
2.9 KiB
C
120 lines
2.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* PPS API kernel header
|
|
*
|
|
* Copyright (C) 2009 Rodolfo Giometti <giometti@linux.it>
|
|
*/
|
|
|
|
#ifndef LINUX_PPS_KERNEL_H
|
|
#define LINUX_PPS_KERNEL_H
|
|
|
|
#include <linux/pps.h>
|
|
#include <linux/cdev.h>
|
|
#include <linux/device.h>
|
|
#include <linux/time.h>
|
|
|
|
/*
|
|
* Global defines
|
|
*/
|
|
|
|
struct pps_device;
|
|
|
|
/* The specific PPS source info */
|
|
struct pps_source_info {
|
|
char name[PPS_MAX_NAME_LEN]; /* symbolic name */
|
|
char path[PPS_MAX_NAME_LEN]; /* path of connected device */
|
|
int mode; /* PPS allowed mode */
|
|
|
|
void (*echo)(struct pps_device *pps,
|
|
int event, void *data); /* PPS echo function */
|
|
|
|
struct module *owner;
|
|
struct device *dev; /* Parent device for device_create */
|
|
};
|
|
|
|
struct pps_event_time {
|
|
#ifdef CONFIG_NTP_PPS
|
|
struct timespec64 ts_raw;
|
|
#endif /* CONFIG_NTP_PPS */
|
|
struct timespec64 ts_real;
|
|
};
|
|
|
|
/* The main struct */
|
|
struct pps_device {
|
|
struct pps_source_info info; /* PSS source info */
|
|
|
|
struct pps_kparams params; /* PPS current params */
|
|
|
|
__u32 assert_sequence; /* PPS assert event seq # */
|
|
__u32 clear_sequence; /* PPS clear event seq # */
|
|
struct pps_ktime assert_tu;
|
|
struct pps_ktime clear_tu;
|
|
int current_mode; /* PPS mode at event time */
|
|
|
|
unsigned int last_ev; /* last PPS event id */
|
|
wait_queue_head_t queue; /* PPS event queue */
|
|
|
|
unsigned int id; /* PPS source unique ID */
|
|
void const *lookup_cookie; /* For pps_lookup_dev() only */
|
|
struct cdev cdev;
|
|
struct device *dev;
|
|
struct fasync_struct *async_queue; /* fasync method */
|
|
spinlock_t lock;
|
|
};
|
|
|
|
/*
|
|
* Global variables
|
|
*/
|
|
|
|
extern const struct attribute_group *pps_groups[];
|
|
|
|
/*
|
|
* Internal functions.
|
|
*
|
|
* These are not actually part of the exported API, but this is a
|
|
* convenient header file to put them in.
|
|
*/
|
|
|
|
extern int pps_register_cdev(struct pps_device *pps);
|
|
extern void pps_unregister_cdev(struct pps_device *pps);
|
|
|
|
/*
|
|
* Exported functions
|
|
*/
|
|
|
|
extern struct pps_device *pps_register_source(
|
|
struct pps_source_info *info, int default_params);
|
|
extern void pps_unregister_source(struct pps_device *pps);
|
|
extern void pps_event(struct pps_device *pps,
|
|
struct pps_event_time *ts, int event, void *data);
|
|
/* Look up a pps_device by magic cookie */
|
|
struct pps_device *pps_lookup_dev(void const *cookie);
|
|
|
|
static inline void timespec_to_pps_ktime(struct pps_ktime *kt,
|
|
struct timespec64 ts)
|
|
{
|
|
kt->sec = ts.tv_sec;
|
|
kt->nsec = ts.tv_nsec;
|
|
}
|
|
|
|
static inline void pps_get_ts(struct pps_event_time *ts)
|
|
{
|
|
struct system_time_snapshot snap;
|
|
|
|
ktime_get_snapshot(&snap);
|
|
ts->ts_real = ktime_to_timespec64(snap.real);
|
|
#ifdef CONFIG_NTP_PPS
|
|
ts->ts_raw = ktime_to_timespec64(snap.raw);
|
|
#endif
|
|
}
|
|
|
|
/* Subtract known time delay from PPS event time(s) */
|
|
static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec64 delta)
|
|
{
|
|
ts->ts_real = timespec64_sub(ts->ts_real, delta);
|
|
#ifdef CONFIG_NTP_PPS
|
|
ts->ts_raw = timespec64_sub(ts->ts_raw, delta);
|
|
#endif
|
|
}
|
|
|
|
#endif /* LINUX_PPS_KERNEL_H */
|