xref: /openbmc/linux/drivers/pps/clients/pps-ktimer.c (revision 74ba9207)
174ba9207SThomas 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 
pps_ktimer_event(struct timer_list * unused)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 
pps_ktimer_exit(void)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 
pps_ktimer_init(void)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