1697fb85fSRodolfo Giometti /* 2697fb85fSRodolfo Giometti * pps-ktimer.c -- kernel timer test client 3697fb85fSRodolfo Giometti * 4697fb85fSRodolfo Giometti * 5697fb85fSRodolfo Giometti * Copyright (C) 2005-2006 Rodolfo Giometti <giometti@linux.it> 6697fb85fSRodolfo Giometti * 7697fb85fSRodolfo Giometti * This program is free software; you can redistribute it and/or modify 8697fb85fSRodolfo Giometti * it under the terms of the GNU General Public License as published by 9697fb85fSRodolfo Giometti * the Free Software Foundation; either version 2 of the License, or 10697fb85fSRodolfo Giometti * (at your option) any later version. 11697fb85fSRodolfo Giometti * 12697fb85fSRodolfo Giometti * This program is distributed in the hope that it will be useful, 13697fb85fSRodolfo Giometti * but WITHOUT ANY WARRANTY; without even the implied warranty of 14697fb85fSRodolfo Giometti * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15697fb85fSRodolfo Giometti * GNU General Public License for more details. 16697fb85fSRodolfo Giometti * 17697fb85fSRodolfo Giometti * You should have received a copy of the GNU General Public License 18697fb85fSRodolfo Giometti * along with this program; if not, write to the Free Software 19697fb85fSRodolfo Giometti * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20697fb85fSRodolfo Giometti */ 21697fb85fSRodolfo Giometti 227f7cce74SAlexander Gordeev #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 23697fb85fSRodolfo Giometti 24697fb85fSRodolfo Giometti #include <linux/kernel.h> 25697fb85fSRodolfo Giometti #include <linux/module.h> 26697fb85fSRodolfo Giometti #include <linux/init.h> 27697fb85fSRodolfo Giometti #include <linux/time.h> 28697fb85fSRodolfo Giometti #include <linux/timer.h> 29697fb85fSRodolfo Giometti #include <linux/pps_kernel.h> 30697fb85fSRodolfo Giometti 31697fb85fSRodolfo Giometti /* 32697fb85fSRodolfo Giometti * Global variables 33697fb85fSRodolfo Giometti */ 34697fb85fSRodolfo Giometti 355e196d34SAlexander Gordeev static struct pps_device *pps; 36697fb85fSRodolfo Giometti static struct timer_list ktimer; 37697fb85fSRodolfo Giometti 38697fb85fSRodolfo Giometti /* 39697fb85fSRodolfo Giometti * The kernel timer 40697fb85fSRodolfo Giometti */ 41697fb85fSRodolfo Giometti 42e99e88a9SKees Cook static void pps_ktimer_event(struct timer_list *unused) 43697fb85fSRodolfo Giometti { 446f4229b5SAlexander Gordeev struct pps_event_time ts; 45697fb85fSRodolfo Giometti 46697fb85fSRodolfo Giometti /* First of all we get the time stamp... */ 476f4229b5SAlexander Gordeev pps_get_ts(&ts); 48697fb85fSRodolfo Giometti 495e196d34SAlexander Gordeev pps_event(pps, &ts, PPS_CAPTUREASSERT, NULL); 50697fb85fSRodolfo Giometti 51697fb85fSRodolfo Giometti mod_timer(&ktimer, jiffies + HZ); 52697fb85fSRodolfo Giometti } 53697fb85fSRodolfo Giometti 54697fb85fSRodolfo Giometti /* 55697fb85fSRodolfo Giometti * The PPS info struct 56697fb85fSRodolfo Giometti */ 57697fb85fSRodolfo Giometti 58697fb85fSRodolfo Giometti static struct pps_source_info pps_ktimer_info = { 59697fb85fSRodolfo Giometti .name = "ktimer", 60697fb85fSRodolfo Giometti .path = "", 61697fb85fSRodolfo Giometti .mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | 62697fb85fSRodolfo Giometti PPS_ECHOASSERT | 63697fb85fSRodolfo Giometti PPS_CANWAIT | PPS_TSFMT_TSPEC, 64697fb85fSRodolfo Giometti .owner = THIS_MODULE, 65697fb85fSRodolfo Giometti }; 66697fb85fSRodolfo Giometti 67697fb85fSRodolfo Giometti /* 68697fb85fSRodolfo Giometti * Module staff 69697fb85fSRodolfo Giometti */ 70697fb85fSRodolfo Giometti 71697fb85fSRodolfo Giometti static void __exit pps_ktimer_exit(void) 72697fb85fSRodolfo Giometti { 735e196d34SAlexander Gordeev dev_info(pps->dev, "ktimer PPS source unregistered\n"); 74697fb85fSRodolfo Giometti 755e196d34SAlexander Gordeev del_timer_sync(&ktimer); 765e196d34SAlexander Gordeev pps_unregister_source(pps); 77697fb85fSRodolfo Giometti } 78697fb85fSRodolfo Giometti 79697fb85fSRodolfo Giometti static int __init pps_ktimer_init(void) 80697fb85fSRodolfo Giometti { 815e196d34SAlexander Gordeev pps = pps_register_source(&pps_ktimer_info, 82697fb85fSRodolfo Giometti PPS_CAPTUREASSERT | PPS_OFFSETASSERT); 835e196d34SAlexander Gordeev if (pps == NULL) { 847f7cce74SAlexander Gordeev pr_err("cannot register PPS source\n"); 855e196d34SAlexander Gordeev return -ENOMEM; 86697fb85fSRodolfo Giometti } 87697fb85fSRodolfo Giometti 88e99e88a9SKees Cook timer_setup(&ktimer, pps_ktimer_event, 0); 89697fb85fSRodolfo Giometti mod_timer(&ktimer, jiffies + HZ); 90697fb85fSRodolfo Giometti 915e196d34SAlexander Gordeev dev_info(pps->dev, "ktimer PPS source registered\n"); 92697fb85fSRodolfo Giometti 93697fb85fSRodolfo Giometti return 0; 94697fb85fSRodolfo Giometti } 95697fb85fSRodolfo Giometti 96697fb85fSRodolfo Giometti module_init(pps_ktimer_init); 97697fb85fSRodolfo Giometti module_exit(pps_ktimer_exit); 98697fb85fSRodolfo Giometti 99697fb85fSRodolfo Giometti MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 100697fb85fSRodolfo Giometti MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)"); 101697fb85fSRodolfo Giometti MODULE_LICENSE("GPL"); 102