1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * pps-ktimer.c -- kernel timer test client 4 * 5 * Copyright (C) 2005-2006 Rodolfo Giometti <giometti@linux.it> 6 */ 7 8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9 10 #include <linux/kernel.h> 11 #include <linux/module.h> 12 #include <linux/init.h> 13 #include <linux/time.h> 14 #include <linux/timer.h> 15 #include <linux/pps_kernel.h> 16 17 /* 18 * Global variables 19 */ 20 21 static struct pps_device *pps; 22 static struct timer_list ktimer; 23 24 /* 25 * The kernel timer 26 */ 27 28 static void pps_ktimer_event(struct timer_list *unused) 29 { 30 struct pps_event_time ts; 31 32 /* First of all we get the time stamp... */ 33 pps_get_ts(&ts); 34 35 pps_event(pps, &ts, PPS_CAPTUREASSERT, NULL); 36 37 mod_timer(&ktimer, jiffies + HZ); 38 } 39 40 /* 41 * The PPS info struct 42 */ 43 44 static struct pps_source_info pps_ktimer_info = { 45 .name = "ktimer", 46 .path = "", 47 .mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | 48 PPS_ECHOASSERT | 49 PPS_CANWAIT | PPS_TSFMT_TSPEC, 50 .owner = THIS_MODULE, 51 }; 52 53 /* 54 * Module staff 55 */ 56 57 static void __exit pps_ktimer_exit(void) 58 { 59 dev_info(pps->dev, "ktimer PPS source unregistered\n"); 60 61 del_timer_sync(&ktimer); 62 pps_unregister_source(pps); 63 } 64 65 static int __init pps_ktimer_init(void) 66 { 67 pps = pps_register_source(&pps_ktimer_info, 68 PPS_CAPTUREASSERT | PPS_OFFSETASSERT); 69 if (IS_ERR(pps)) { 70 pr_err("cannot register PPS source\n"); 71 return PTR_ERR(pps); 72 } 73 74 timer_setup(&ktimer, pps_ktimer_event, 0); 75 mod_timer(&ktimer, jiffies + HZ); 76 77 dev_info(pps->dev, "ktimer PPS source registered\n"); 78 79 return 0; 80 } 81 82 module_init(pps_ktimer_init); 83 module_exit(pps_ktimer_exit); 84 85 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 86 MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)"); 87 MODULE_LICENSE("GPL"); 88