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 22697fb85fSRodolfo Giometti 23697fb85fSRodolfo Giometti #include <linux/kernel.h> 24697fb85fSRodolfo Giometti #include <linux/module.h> 25697fb85fSRodolfo Giometti #include <linux/init.h> 26697fb85fSRodolfo Giometti #include <linux/time.h> 27697fb85fSRodolfo Giometti #include <linux/timer.h> 28697fb85fSRodolfo Giometti #include <linux/pps_kernel.h> 29697fb85fSRodolfo Giometti 30697fb85fSRodolfo Giometti /* 31697fb85fSRodolfo Giometti * Global variables 32697fb85fSRodolfo Giometti */ 33697fb85fSRodolfo Giometti 345e196d34SAlexander Gordeev static struct pps_device *pps; 35697fb85fSRodolfo Giometti static struct timer_list ktimer; 36697fb85fSRodolfo Giometti 37697fb85fSRodolfo Giometti /* 38697fb85fSRodolfo Giometti * The kernel timer 39697fb85fSRodolfo Giometti */ 40697fb85fSRodolfo Giometti 41697fb85fSRodolfo Giometti static void pps_ktimer_event(unsigned long ptr) 42697fb85fSRodolfo Giometti { 436f4229b5SAlexander Gordeev struct pps_event_time ts; 44697fb85fSRodolfo Giometti 45697fb85fSRodolfo Giometti /* First of all we get the time stamp... */ 466f4229b5SAlexander Gordeev pps_get_ts(&ts); 47697fb85fSRodolfo Giometti 48697fb85fSRodolfo Giometti pr_info("PPS event at %lu\n", jiffies); 49697fb85fSRodolfo Giometti 505e196d34SAlexander Gordeev pps_event(pps, &ts, PPS_CAPTUREASSERT, NULL); 51697fb85fSRodolfo Giometti 52697fb85fSRodolfo Giometti mod_timer(&ktimer, jiffies + HZ); 53697fb85fSRodolfo Giometti } 54697fb85fSRodolfo Giometti 55697fb85fSRodolfo Giometti /* 56697fb85fSRodolfo Giometti * The echo function 57697fb85fSRodolfo Giometti */ 58697fb85fSRodolfo Giometti 595e196d34SAlexander Gordeev static void pps_ktimer_echo(struct pps_device *pps, int event, void *data) 60697fb85fSRodolfo Giometti { 615e196d34SAlexander Gordeev dev_info(pps->dev, "echo %s %s\n", 62697fb85fSRodolfo Giometti event & PPS_CAPTUREASSERT ? "assert" : "", 635e196d34SAlexander Gordeev event & PPS_CAPTURECLEAR ? "clear" : ""); 64697fb85fSRodolfo Giometti } 65697fb85fSRodolfo Giometti 66697fb85fSRodolfo Giometti /* 67697fb85fSRodolfo Giometti * The PPS info struct 68697fb85fSRodolfo Giometti */ 69697fb85fSRodolfo Giometti 70697fb85fSRodolfo Giometti static struct pps_source_info pps_ktimer_info = { 71697fb85fSRodolfo Giometti .name = "ktimer", 72697fb85fSRodolfo Giometti .path = "", 73697fb85fSRodolfo Giometti .mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | 74697fb85fSRodolfo Giometti PPS_ECHOASSERT | 75697fb85fSRodolfo Giometti PPS_CANWAIT | PPS_TSFMT_TSPEC, 76697fb85fSRodolfo Giometti .echo = pps_ktimer_echo, 77697fb85fSRodolfo Giometti .owner = THIS_MODULE, 78697fb85fSRodolfo Giometti }; 79697fb85fSRodolfo Giometti 80697fb85fSRodolfo Giometti /* 81697fb85fSRodolfo Giometti * Module staff 82697fb85fSRodolfo Giometti */ 83697fb85fSRodolfo Giometti 84697fb85fSRodolfo Giometti static void __exit pps_ktimer_exit(void) 85697fb85fSRodolfo Giometti { 865e196d34SAlexander Gordeev dev_info(pps->dev, "ktimer PPS source unregistered\n"); 87697fb85fSRodolfo Giometti 885e196d34SAlexander Gordeev del_timer_sync(&ktimer); 895e196d34SAlexander Gordeev pps_unregister_source(pps); 90697fb85fSRodolfo Giometti } 91697fb85fSRodolfo Giometti 92697fb85fSRodolfo Giometti static int __init pps_ktimer_init(void) 93697fb85fSRodolfo Giometti { 945e196d34SAlexander Gordeev pps = pps_register_source(&pps_ktimer_info, 95697fb85fSRodolfo Giometti PPS_CAPTUREASSERT | PPS_OFFSETASSERT); 965e196d34SAlexander Gordeev if (pps == NULL) { 97697fb85fSRodolfo Giometti printk(KERN_ERR "cannot register ktimer source\n"); 985e196d34SAlexander Gordeev return -ENOMEM; 99697fb85fSRodolfo Giometti } 100697fb85fSRodolfo Giometti 101697fb85fSRodolfo Giometti setup_timer(&ktimer, pps_ktimer_event, 0); 102697fb85fSRodolfo Giometti mod_timer(&ktimer, jiffies + HZ); 103697fb85fSRodolfo Giometti 1045e196d34SAlexander Gordeev dev_info(pps->dev, "ktimer PPS source registered\n"); 105697fb85fSRodolfo Giometti 106697fb85fSRodolfo Giometti return 0; 107697fb85fSRodolfo Giometti } 108697fb85fSRodolfo Giometti 109697fb85fSRodolfo Giometti module_init(pps_ktimer_init); 110697fb85fSRodolfo Giometti module_exit(pps_ktimer_exit); 111697fb85fSRodolfo Giometti 112697fb85fSRodolfo Giometti MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 113697fb85fSRodolfo Giometti MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)"); 114697fb85fSRodolfo Giometti MODULE_LICENSE("GPL"); 115