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