linux/include/linux/ptp_clock_kernel.h
<<
>>
Prefs
   1/*
   2 * PTP 1588 clock support
   3 *
   4 * Copyright (C) 2010 OMICRON electronics GmbH
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License as published by
   8 *  the Free Software Foundation; either version 2 of the License, or
   9 *  (at your option) any later version.
  10 *
  11 *  This program is distributed in the hope that it will be useful,
  12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *  GNU General Public License for more details.
  15 *
  16 *  You should have received a copy of the GNU General Public License
  17 *  along with this program; if not, write to the Free Software
  18 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19 */
  20
  21#ifndef _PTP_CLOCK_KERNEL_H_
  22#define _PTP_CLOCK_KERNEL_H_
  23
  24#include <linux/ptp_clock.h>
  25
  26
  27struct ptp_clock_request {
  28        enum {
  29                PTP_CLK_REQ_EXTTS,
  30                PTP_CLK_REQ_PEROUT,
  31                PTP_CLK_REQ_PPS,
  32        } type;
  33        union {
  34                struct ptp_extts_request extts;
  35                struct ptp_perout_request perout;
  36        };
  37};
  38
  39/**
  40 * struct ptp_clock_info - decribes a PTP hardware clock
  41 *
  42 * @owner:     The clock driver should set to THIS_MODULE.
  43 * @name:      A short name to identify the clock.
  44 * @max_adj:   The maximum possible frequency adjustment, in parts per billon.
  45 * @n_alarm:   The number of programmable alarms.
  46 * @n_ext_ts:  The number of external time stamp channels.
  47 * @n_per_out: The number of programmable periodic signals.
  48 * @pps:       Indicates whether the clock supports a PPS callback.
  49 *
  50 * clock operations
  51 *
  52 * @adjfreq:  Adjusts the frequency of the hardware clock.
  53 *            parameter delta: Desired period change in parts per billion.
  54 *
  55 * @adjtime:  Shifts the time of the hardware clock.
  56 *            parameter delta: Desired change in nanoseconds.
  57 *
  58 * @gettime:  Reads the current time from the hardware clock.
  59 *            parameter ts: Holds the result.
  60 *
  61 * @settime:  Set the current time on the hardware clock.
  62 *            parameter ts: Time value to set.
  63 *
  64 * @enable:   Request driver to enable or disable an ancillary feature.
  65 *            parameter request: Desired resource to enable or disable.
  66 *            parameter on: Caller passes one to enable or zero to disable.
  67 *
  68 * Drivers should embed their ptp_clock_info within a private
  69 * structure, obtaining a reference to it using container_of().
  70 *
  71 * The callbacks must all return zero on success, non-zero otherwise.
  72 */
  73
  74struct ptp_clock_info {
  75        struct module *owner;
  76        char name[16];
  77        s32 max_adj;
  78        int n_alarm;
  79        int n_ext_ts;
  80        int n_per_out;
  81        int pps;
  82        int (*adjfreq)(struct ptp_clock_info *ptp, s32 delta);
  83        int (*adjtime)(struct ptp_clock_info *ptp, s64 delta);
  84        int (*gettime)(struct ptp_clock_info *ptp, struct timespec *ts);
  85        int (*settime)(struct ptp_clock_info *ptp, const struct timespec *ts);
  86        int (*enable)(struct ptp_clock_info *ptp,
  87                      struct ptp_clock_request *request, int on);
  88};
  89
  90struct ptp_clock;
  91
  92/**
  93 * ptp_clock_register() - register a PTP hardware clock driver
  94 *
  95 * @info:  Structure describing the new clock.
  96 */
  97
  98extern struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info);
  99
 100/**
 101 * ptp_clock_unregister() - unregister a PTP hardware clock driver
 102 *
 103 * @ptp:  The clock to remove from service.
 104 */
 105
 106extern int ptp_clock_unregister(struct ptp_clock *ptp);
 107
 108
 109enum ptp_clock_events {
 110        PTP_CLOCK_ALARM,
 111        PTP_CLOCK_EXTTS,
 112        PTP_CLOCK_PPS,
 113};
 114
 115/**
 116 * struct ptp_clock_event - decribes a PTP hardware clock event
 117 *
 118 * @type:  One of the ptp_clock_events enumeration values.
 119 * @index: Identifies the source of the event.
 120 * @timestamp: When the event occured.
 121 */
 122
 123struct ptp_clock_event {
 124        int type;
 125        int index;
 126        u64 timestamp;
 127};
 128
 129/**
 130 * ptp_clock_event() - notify the PTP layer about an event
 131 *
 132 * @ptp:    The clock obtained from ptp_clock_register().
 133 * @event:  Message structure describing the event.
 134 */
 135
 136extern void ptp_clock_event(struct ptp_clock *ptp,
 137                            struct ptp_clock_event *event);
 138
 139/**
 140 * ptp_clock_index() - obtain the device index of a PTP clock
 141 *
 142 * @ptp:    The clock obtained from ptp_clock_register().
 143 */
 144
 145extern int ptp_clock_index(struct ptp_clock *ptp);
 146
 147#endif
 148