pps-ktimer.c (1746B)
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 21static struct pps_device *pps; 22static struct timer_list ktimer; 23 24/* 25 * The kernel timer 26 */ 27 28static 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 44static 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 57static 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 65static 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 82module_init(pps_ktimer_init); 83module_exit(pps_ktimer_exit); 84 85MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); 86MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)"); 87MODULE_LICENSE("GPL");