1*74ba9207SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2697fb85fSRodolfo Giometti /* 3697fb85fSRodolfo Giometti * pps-ktimer.c -- kernel timer test client 4697fb85fSRodolfo Giometti * 5697fb85fSRodolfo Giometti * Copyright (C) 2005-2006 Rodolfo Giometti <giometti@linux.it> 6697fb85fSRodolfo Giometti */ 7697fb85fSRodolfo Giometti 87f7cce74SAlexander Gordeev #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9697fb85fSRodolfo Giometti 10697fb85fSRodolfo Giometti #include <linux/kernel.h> 11697fb85fSRodolfo Giometti #include <linux/module.h> 12697fb85fSRodolfo Giometti #include <linux/init.h> 13697fb85fSRodolfo Giometti #include <linux/time.h> 14697fb85fSRodolfo Giometti #include <linux/timer.h> 15697fb85fSRodolfo Giometti #include <linux/pps_kernel.h> 16697fb85fSRodolfo Giometti 17697fb85fSRodolfo Giometti /* 18697fb85fSRodolfo Giometti * Global variables 19697fb85fSRodolfo Giometti */ 20697fb85fSRodolfo Giometti 215e196d34SAlexander Gordeev static struct pps_device *pps; 22697fb85fSRodolfo Giometti static struct timer_list ktimer; 23697fb85fSRodolfo Giometti 24697fb85fSRodolfo Giometti /* 25697fb85fSRodolfo Giometti * The kernel timer 26697fb85fSRodolfo Giometti */ 27697fb85fSRodolfo Giometti 28e99e88a9SKees Cook static void pps_ktimer_event(struct timer_list *unused) 29697fb85fSRodolfo Giometti { 306f4229b5SAlexander Gordeev struct pps_event_time ts; 31697fb85fSRodolfo Giometti 32697fb85fSRodolfo Giometti /* First of all we get the time stamp... */ 336f4229b5SAlexander Gordeev pps_get_ts(&ts); 34697fb85fSRodolfo Giometti 355e196d34SAlexander Gordeev pps_event(pps, &ts, PPS_CAPTUREASSERT, NULL); 36697fb85fSRodolfo Giometti 37697fb85fSRodolfo Giometti mod_timer(&ktimer, jiffies + HZ); 38697fb85fSRodolfo Giometti } 39697fb85fSRodolfo Giometti 40697fb85fSRodolfo Giometti /* 41697fb85fSRodolfo Giometti * The PPS info struct 42697fb85fSRodolfo Giometti */ 43697fb85fSRodolfo Giometti 44697fb85fSRodolfo Giometti static struct pps_source_info pps_ktimer_info = { 45697fb85fSRodolfo Giometti .name = "ktimer", 46697fb85fSRodolfo Giometti .path = "", 47697fb85fSRodolfo Giometti .mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | 48697fb85fSRodolfo Giometti PPS_ECHOASSERT | 49697fb85fSRodolfo Giometti PPS_CANWAIT | PPS_TSFMT_TSPEC, 50697fb85fSRodolfo Giometti .owner = THIS_MODULE, 51697fb85fSRodolfo Giometti }; 52697fb85fSRodolfo Giometti 53697fb85fSRodolfo Giometti /* 54697fb85fSRodolfo Giometti * Module staff 55697fb85fSRodolfo Giometti */ 56697fb85fSRodolfo Giometti 57697fb85fSRodolfo Giometti static void __exit pps_ktimer_exit(void) 58697fb85fSRodolfo Giometti { 595e196d34SAlexander Gordeev dev_info(pps->dev, "ktimer PPS source unregistered\n"); 60697fb85fSRodolfo Giometti 615e196d34SAlexander Gordeev del_timer_sync(&ktimer); 625e196d34SAlexander Gordeev pps_unregister_source(pps); 63697fb85fSRodolfo Giometti } 64697fb85fSRodolfo Giometti 65697fb85fSRodolfo Giometti static int __init pps_ktimer_init(void) 66697fb85fSRodolfo Giometti { 675e196d34SAlexander Gordeev pps = pps_register_source(&pps_ktimer_info, 68697fb85fSRodolfo Giometti PPS_CAPTUREASSERT | PPS_OFFSETASSERT); 693b1ad360SYueHaibing if (IS_ERR(pps)) { 707f7cce74SAlexander Gordeev pr_err("cannot register PPS source\n"); 713b1ad360SYueHaibing return PTR_ERR(pps); 72697fb85fSRodolfo Giometti } 73697fb85fSRodolfo Giometti 74e99e88a9SKees Cook timer_setup(&ktimer, pps_ktimer_event, 0); 75697fb85fSRodolfo Giometti mod_timer(&ktimer, jiffies + HZ); 76697fb85fSRodolfo Giometti 775e196d34SAlexander Gordeev dev_info(pps->dev, "ktimer PPS source registered\n"); 78697fb85fSRodolfo Giometti 79697fb85fSRodolfo Giometti return 0; 80697fb85fSRodolfo Giometti } 81697fb85fSRodolfo Giometti 82697fb85fSRodolfo Giometti module_init(pps_ktimer_init); 83697fb85fSRodolfo Giometti module_exit(pps_ktimer_exit); 84697fb85fSRodolfo Giometti 85697fb85fSRodolfo Giometti MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 86697fb85fSRodolfo Giometti MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)"); 87697fb85fSRodolfo Giometti MODULE_LICENSE("GPL"); 88