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/device.h>
  25#include <linux/pps_kernel.h>
  26#include <linux/ptp_clock.h>
  27
  28
  29struct ptp_clock_request {
  30        enum {
  31                PTP_CLK_REQ_EXTTS,
  32                PTP_CLK_REQ_PEROUT,
  33                PTP_CLK_REQ_PPS,
  34        } type;
  35        union {
  36                struct ptp_extts_request extts;
  37                struct ptp_perout_request perout;
  38        };
  39};
  40
  41/**
  42 * struct ptp_clock_info - decribes a PTP hardware clock
  43 *
  44 * @owner:     The clock driver should set to THIS_MODULE.
  45 * @name:      A short "friendly name" to identify the clock and to
  46 *             help distinguish PHY based devices from MAC based ones.
  47 *             The string is not meant to be a unique id.
  48 * @max_adj:   The maximum possible frequency adjustment, in parts per billon.
  49 * @n_alarm:   The number of programmable alarms.
  50 * @n_ext_ts:  The number of external time stamp channels.
  51 * @n_per_out: The number of programmable periodic signals.
  52 * @pps:       Indicates whether the clock supports a PPS callback.
  53 *
  54 * clock operations
  55 *
  56 * @adjfreq:  Adjusts the frequency of the hardware clock.
  57 *            parameter delta: Desired frequency offset from nominal frequency
  58 *            in parts per billion
  59 *
  60 * @adjtime:  Shifts the time of the hardware clock.
  61 *            parameter delta: Desired change in nanoseconds.
  62 *
  63 * @gettime:  Reads the current time from the hardware clock.
  64 *            parameter ts: Holds the result.
  65 *
  66 * @settime:  Set the current time on the hardware clock.
  67 *            parameter ts: Time value to set.
  68 *
  69 * @enable:   Request driver to enable or disable an ancillary feature.
  70 *            parameter request: Desired resource to enable or disable.
  71 *            parameter on: Caller passes one to enable or zero to disable.
  72 *
  73 * Drivers should embed their ptp_clock_info within a private
  74 * structure, obtaining a reference to it using container_of().
  75 *
  76 * The callbacks must all return zero on success, non-zero otherwise.
  77 */
  78
  79struct ptp_clock_info {
  80        struct module *owner;
  81        char name[16];
  82        s32 max_adj;
  83        int n_alarm;
  84        int n_ext_ts;
  85        int n_per_out;
  86        int pps;
  87        int (*adjfreq)(struct ptp_clock_info *ptp, s32 delta);
  88        int (*adjtime)(struct ptp_clock_info *ptp, s64 delta);
  89        int (*gettime)(struct ptp_clock_info *ptp, struct timespec *ts);
  90        int (*settime)(struct ptp_clock_info *ptp, const struct timespec *ts);
  91        int (*enable)(struct ptp_clock_info *ptp,
  92                      struct ptp_clock_request *request, int on);
  93};
  94
  95struct ptp_clock;
  96
  97/**
  98 * ptp_clock_register() - register a PTP hardware clock driver
  99 *
 100 * @info:   Structure describing the new clock.
 101 * @parent: Pointer to the parent device of the new clock.
 102 */
 103
 104extern struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
 105                                            struct device *parent);
 106
 107/**
 108 * ptp_clock_unregister() - unregister a PTP hardware clock driver
 109 *
 110 * @ptp:  The clock to remove from service.
 111 */
 112
 113extern int ptp_clock_unregister(struct ptp_clock *ptp);
 114
 115
 116enum ptp_clock_events {
 117        PTP_CLOCK_ALARM,
 118        PTP_CLOCK_EXTTS,
 119        PTP_CLOCK_PPS,
 120        PTP_CLOCK_PPSUSR,
 121};
 122
 123/**
 124 * struct ptp_clock_event - decribes a PTP hardware clock event
 125 *
 126 * @type:  One of the ptp_clock_events enumeration values.
 127 * @index: Identifies the source of the event.
 128 * @timestamp: When the event occurred (%PTP_CLOCK_EXTTS only).
 129 * @pps_times: When the event occurred (%PTP_CLOCK_PPSUSR only).
 130 */
 131
 132struct ptp_clock_event {
 133        int type;
 134        int index;
 135        union {
 136                u64 timestamp;
 137                struct pps_event_time pps_times;
 138        };
 139};
 140
 141/**
 142 * ptp_clock_event() - notify the PTP layer about an event
 143 *
 144 * @ptp:    The clock obtained from ptp_clock_register().
 145 * @event:  Message structure describing the event.
 146 */
 147
 148extern void ptp_clock_event(struct ptp_clock *ptp,
 149                            struct ptp_clock_event *event);
 150
 151/**
 152 * ptp_clock_index() - obtain the device index of a PTP clock
 153 *
 154 * @ptp:    The clock obtained from ptp_clock_register().
 155 */
 156
 157extern int ptp_clock_index(struct ptp_clock *ptp);
 158
 159#endif
 160