linux/drivers/pps/clients/pps-ktimer.c
<<
>>
Prefs
   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");
  88