Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[cascardo/linux.git] / include / linux / pps_kernel.h
index e0a193f..9404854 100644 (file)
@@ -18,6 +18,9 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#ifndef LINUX_PPS_KERNEL_H
+#define LINUX_PPS_KERNEL_H
+
 #include <linux/pps.h>
 
 #include <linux/cdev.h>
  * Global defines
  */
 
+struct pps_device;
+
 /* The specific PPS source info */
 struct pps_source_info {
        char name[PPS_MAX_NAME_LEN];            /* simbolic name */
        char path[PPS_MAX_NAME_LEN];            /* path of connected device */
        int mode;                               /* PPS's allowed mode */
 
-       void (*echo)(int source, int event, void *data); /* PPS echo function */
+       void (*echo)(struct pps_device *pps,
+                       int event, void *data); /* PPS echo function */
 
        struct module *owner;
        struct device *dev;
 };
 
+struct pps_event_time {
+#ifdef CONFIG_NTP_PPS
+       struct timespec ts_raw;
+#endif /* CONFIG_NTP_PPS */
+       struct timespec ts_real;
+};
+
 /* The main struct */
 struct pps_device {
        struct pps_source_info info;            /* PSS source info */
@@ -52,38 +65,56 @@ struct pps_device {
        struct pps_ktime clear_tu;
        int current_mode;                       /* PPS mode at event time */
 
-       int go;                                 /* PPS event is arrived? */
+       unsigned int last_ev;                   /* last PPS event id */
        wait_queue_head_t queue;                /* PPS event queue */
 
        unsigned int id;                        /* PPS source unique ID */
        struct cdev cdev;
        struct device *dev;
-       int devno;
        struct fasync_struct *async_queue;      /* fasync method */
        spinlock_t lock;
-
-       atomic_t usage;                         /* usage count */
 };
 
 /*
  * Global variables
  */
 
-extern spinlock_t pps_idr_lock;
-extern struct idr pps_idr;
-extern struct timespec pps_irq_ts[];
-
 extern struct device_attribute pps_attrs[];
 
 /*
  * Exported functions
  */
 
-struct pps_device *pps_get_source(int source);
-extern void pps_put_source(struct pps_device *pps);
-extern int pps_register_source(struct pps_source_info *info,
-                               int default_params);
-extern void pps_unregister_source(int source);
+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 int pps_register_cdev(struct pps_device *pps);
 extern void pps_unregister_cdev(struct pps_device *pps);
-extern void pps_event(int source, struct pps_ktime *ts, int event, void *data);
+extern void pps_event(struct pps_device *pps,
+               struct pps_event_time *ts, int event, void *data);
+
+static inline void timespec_to_pps_ktime(struct pps_ktime *kt,
+               struct timespec ts)
+{
+       kt->sec = ts.tv_sec;
+       kt->nsec = ts.tv_nsec;
+}
+
+#ifdef CONFIG_NTP_PPS
+
+static inline void pps_get_ts(struct pps_event_time *ts)
+{
+       getnstime_raw_and_real(&ts->ts_raw, &ts->ts_real);
+}
+
+#else /* CONFIG_NTP_PPS */
+
+static inline void pps_get_ts(struct pps_event_time *ts)
+{
+       getnstimeofday(&ts->ts_real);
+}
+
+#endif /* CONFIG_NTP_PPS */
+
+#endif /* LINUX_PPS_KERNEL_H */
+