2010-03-11 02:23:45 +03:00
/*
* pps - ktimer . c - - kernel timer test client
*
*
* Copyright ( C ) 2005 - 2006 Rodolfo Giometti < giometti @ linux . it >
*
* 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 0213 9 , USA .
*/
2011-01-13 04:00:52 +03:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2010-03-11 02:23:45 +03:00
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/init.h>
# include <linux/time.h>
# include <linux/timer.h>
# include <linux/pps_kernel.h>
/*
* Global variables
*/
2011-01-13 04:00:51 +03:00
static struct pps_device * pps ;
2010-03-11 02:23:45 +03:00
static struct timer_list ktimer ;
/*
* The kernel timer
*/
static void pps_ktimer_event ( unsigned long ptr )
{
2011-01-13 04:00:50 +03:00
struct pps_event_time ts ;
2010-03-11 02:23:45 +03:00
/* First of all we get the time stamp... */
2011-01-13 04:00:50 +03:00
pps_get_ts ( & ts ) ;
2010-03-11 02:23:45 +03:00
2011-01-13 04:00:51 +03:00
pps_event ( pps , & ts , PPS_CAPTUREASSERT , NULL ) ;
2010-03-11 02:23:45 +03:00
mod_timer ( & ktimer , jiffies + HZ ) ;
}
/*
* The PPS info struct
*/
static struct pps_source_info pps_ktimer_info = {
. name = " ktimer " ,
. path = " " ,
. mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT |
PPS_ECHOASSERT |
PPS_CANWAIT | PPS_TSFMT_TSPEC ,
. owner = THIS_MODULE ,
} ;
/*
* Module staff
*/
static void __exit pps_ktimer_exit ( void )
{
2011-01-13 04:00:51 +03:00
dev_info ( pps - > dev , " ktimer PPS source unregistered \n " ) ;
2010-03-11 02:23:45 +03:00
2011-01-13 04:00:51 +03:00
del_timer_sync ( & ktimer ) ;
pps_unregister_source ( pps ) ;
2010-03-11 02:23:45 +03:00
}
static int __init pps_ktimer_init ( void )
{
2011-01-13 04:00:51 +03:00
pps = pps_register_source ( & pps_ktimer_info ,
2010-03-11 02:23:45 +03:00
PPS_CAPTUREASSERT | PPS_OFFSETASSERT ) ;
2011-01-13 04:00:51 +03:00
if ( pps = = NULL ) {
2011-01-13 04:00:52 +03:00
pr_err ( " cannot register PPS source \n " ) ;
2011-01-13 04:00:51 +03:00
return - ENOMEM ;
2010-03-11 02:23:45 +03:00
}
setup_timer ( & ktimer , pps_ktimer_event , 0 ) ;
mod_timer ( & ktimer , jiffies + HZ ) ;
2011-01-13 04:00:51 +03:00
dev_info ( pps - > dev , " ktimer PPS source registered \n " ) ;
2010-03-11 02:23:45 +03:00
2011-01-13 04:00:51 +03:00
return 0 ;
2010-03-11 02:23:45 +03:00
}
module_init ( pps_ktimer_init ) ;
module_exit ( pps_ktimer_exit ) ;
MODULE_AUTHOR ( " Rodolfo Giometti <giometti@linux.it> " ) ;
MODULE_DESCRIPTION ( " dummy PPS source by using a kernel timer (just for debug) " ) ;
MODULE_LICENSE ( " GPL " ) ;