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