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 34697fb85fSRodolfo Giometti static int source; 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 50697fb85fSRodolfo Giometti pps_event(source, &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 59697fb85fSRodolfo Giometti static void pps_ktimer_echo(int source, int event, void *data) 60697fb85fSRodolfo Giometti { 61697fb85fSRodolfo Giometti pr_info("echo %s %s for source %d\n", 62697fb85fSRodolfo Giometti event & PPS_CAPTUREASSERT ? "assert" : "", 63697fb85fSRodolfo Giometti event & PPS_CAPTURECLEAR ? "clear" : "", 64697fb85fSRodolfo Giometti source); 65697fb85fSRodolfo Giometti } 66697fb85fSRodolfo Giometti 67697fb85fSRodolfo Giometti /* 68697fb85fSRodolfo Giometti * The PPS info struct 69697fb85fSRodolfo Giometti */ 70697fb85fSRodolfo Giometti 71697fb85fSRodolfo Giometti static struct pps_source_info pps_ktimer_info = { 72697fb85fSRodolfo Giometti .name = "ktimer", 73697fb85fSRodolfo Giometti .path = "", 74697fb85fSRodolfo Giometti .mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | 75697fb85fSRodolfo Giometti PPS_ECHOASSERT | 76697fb85fSRodolfo Giometti PPS_CANWAIT | PPS_TSFMT_TSPEC, 77697fb85fSRodolfo Giometti .echo = pps_ktimer_echo, 78697fb85fSRodolfo Giometti .owner = THIS_MODULE, 79697fb85fSRodolfo Giometti }; 80697fb85fSRodolfo Giometti 81697fb85fSRodolfo Giometti /* 82697fb85fSRodolfo Giometti * Module staff 83697fb85fSRodolfo Giometti */ 84697fb85fSRodolfo Giometti 85697fb85fSRodolfo Giometti static void __exit pps_ktimer_exit(void) 86697fb85fSRodolfo Giometti { 87697fb85fSRodolfo Giometti del_timer_sync(&ktimer); 88697fb85fSRodolfo Giometti pps_unregister_source(source); 89697fb85fSRodolfo Giometti 90697fb85fSRodolfo Giometti pr_info("ktimer PPS source unregistered\n"); 91697fb85fSRodolfo Giometti } 92697fb85fSRodolfo Giometti 93697fb85fSRodolfo Giometti static int __init pps_ktimer_init(void) 94697fb85fSRodolfo Giometti { 95697fb85fSRodolfo Giometti int ret; 96697fb85fSRodolfo Giometti 97697fb85fSRodolfo Giometti ret = pps_register_source(&pps_ktimer_info, 98697fb85fSRodolfo Giometti PPS_CAPTUREASSERT | PPS_OFFSETASSERT); 99697fb85fSRodolfo Giometti if (ret < 0) { 100697fb85fSRodolfo Giometti printk(KERN_ERR "cannot register ktimer source\n"); 101697fb85fSRodolfo Giometti return ret; 102697fb85fSRodolfo Giometti } 103697fb85fSRodolfo Giometti source = ret; 104697fb85fSRodolfo Giometti 105697fb85fSRodolfo Giometti setup_timer(&ktimer, pps_ktimer_event, 0); 106697fb85fSRodolfo Giometti mod_timer(&ktimer, jiffies + HZ); 107697fb85fSRodolfo Giometti 108697fb85fSRodolfo Giometti pr_info("ktimer PPS source registered at %d\n", source); 109697fb85fSRodolfo Giometti 110697fb85fSRodolfo Giometti return 0; 111697fb85fSRodolfo Giometti } 112697fb85fSRodolfo Giometti 113697fb85fSRodolfo Giometti module_init(pps_ktimer_init); 114697fb85fSRodolfo Giometti module_exit(pps_ktimer_exit); 115697fb85fSRodolfo Giometti 116697fb85fSRodolfo Giometti MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 117697fb85fSRodolfo Giometti MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)"); 118697fb85fSRodolfo Giometti MODULE_LICENSE("GPL"); 119