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
  41struct system_device_crosststamp;
  42/**
  43 * struct ptp_clock_info - decribes a PTP hardware clock
  44 *
  45 * @owner:     The clock driver should set to THIS_MODULE.
  46 * @name:      A short "friendly name" to identify the clock and to
  47 *             help distinguish PHY based devices from MAC based ones.
  48 *             The string is not meant to be a unique id.
  49 * @max_adj:   The maximum possible frequency adjustment, in parts per billon.
  50 * @n_alarm:   The number of programmable alarms.
  51 * @n_ext_ts:  The number of external time stamp channels.
  52 * @n_per_out: The number of programmable periodic signals.
  53 * @n_pins:    The number of programmable pins.
  54 * @pps:       Indicates whether the clock supports a PPS callback.
  55 * @pin_config: Array of length 'n_pins'. If the number of
  56 *              programmable pins is nonzero, then drivers must
  57 *              allocate and initialize this array.
  58 *
  59 * clock operations
  60 *
  61 * @adjfine:  Adjusts the frequency of the hardware clock.
  62 *            parameter scaled_ppm: Desired frequency offset from
  63 *            nominal frequency in parts per million, but with a
  64 *            16 bit binary fractional field.
  65 *
  66 * @adjfreq:  Adjusts the frequency of the hardware clock.
  67 *            This method is deprecated.  New drivers should implement
  68 *            the @adjfine method instead.
  69 *            parameter delta: Desired frequency offset from nominal frequency
  70 *            in parts per billion
  71 *
  72 * @adjtime:  Shifts the time of the hardware clock.
  73 *            parameter delta: Desired change in nanoseconds.
  74 *
  75 * @gettime64:  Reads the current time from the hardware clock.
  76 *              parameter ts: Holds the result.
  77 *
  78 * @getcrosststamp:  Reads the current time from the hardware clock and
  79 *                   system clock simultaneously.
  80 *                   parameter cts: Contains timestamp (device,system) pair,
  81 *                   where system time is realtime and monotonic.
  82 *
  83 * @settime64:  Set the current time on the hardware clock.
  84 *              parameter ts: Time value to set.
  85 *
  86 * @enable:   Request driver to enable or disable an ancillary feature.
  87 *            parameter request: Desired resource to enable or disable.
  88 *            parameter on: Caller passes one to enable or zero to disable.
  89 *
  90 * @verify:   Confirm that a pin can perform a given function. The PTP
  91 *            Hardware Clock subsystem maintains the 'pin_config'
  92 *            array on behalf of the drivers, but the PHC subsystem
  93 *            assumes that every pin can perform every function. This
  94 *            hook gives drivers a way of telling the core about
  95 *            limitations on specific pins. This function must return
  96 *            zero if the function can be assigned to this pin, and
  97 *            nonzero otherwise.
  98 *            parameter pin: index of the pin in question.
  99 *            parameter func: the desired function to use.
 100 *            parameter chan: the function channel index to use.
 101 *
 102 * @do_work:  Request driver to perform auxiliary (periodic) operations
 103 *            Driver should return delay of the next auxiliary work scheduling
 104 *            time (>=0) or negative value in case further scheduling
 105 *            is not required.
 106 *
 107 * Drivers should embed their ptp_clock_info within a private
 108 * structure, obtaining a reference to it using container_of().
 109 *
 110 * The callbacks must all return zero on success, non-zero otherwise.
 111 */
 112
 113struct ptp_clock_info {
 114        struct module *owner;
 115        char name[16];
 116        s32 max_adj;
 117        int n_alarm;
 118        int n_ext_ts;
 119        int n_per_out;
 120        int n_pins;
 121        int pps;
 122        struct ptp_pin_desc *pin_config;
 123        int (*adjfine)(struct ptp_clock_info *ptp, long scaled_ppm);
 124        int (*adjfreq)(struct ptp_clock_info *ptp, s32 delta);
 125        int (*adjtime)(struct ptp_clock_info *ptp, s64 delta);
 126        int (*gettime64)(struct ptp_clock_info *ptp, struct timespec64 *ts);
 127        int (*getcrosststamp)(struct ptp_clock_info *ptp,
 128                              struct system_device_crosststamp *cts);
 129        int (*settime64)(struct ptp_clock_info *p, const struct timespec64 *ts);
 130        int (*enable)(struct ptp_clock_info *ptp,
 131                      struct ptp_clock_request *request, int on);
 132        int (*verify)(struct ptp_clock_info *ptp, unsigned int pin,
 133                      enum ptp_pin_function func, unsigned int chan);
 134        long (*do_aux_work)(struct ptp_clock_info *ptp);
 135};
 136
 137struct ptp_clock;
 138
 139enum ptp_clock_events {
 140        PTP_CLOCK_ALARM,
 141        PTP_CLOCK_EXTTS,
 142        PTP_CLOCK_PPS,
 143        PTP_CLOCK_PPSUSR,
 144};
 145
 146/**
 147 * struct ptp_clock_event - decribes a PTP hardware clock event
 148 *
 149 * @type:  One of the ptp_clock_events enumeration values.
 150 * @index: Identifies the source of the event.
 151 * @timestamp: When the event occurred (%PTP_CLOCK_EXTTS only).
 152 * @pps_times: When the event occurred (%PTP_CLOCK_PPSUSR only).
 153 */
 154
 155struct ptp_clock_event {
 156        int type;
 157        int index;
 158        union {
 159                u64 timestamp;
 160                struct pps_event_time pps_times;
 161        };
 162};
 163
 164#if IS_REACHABLE(CONFIG_PTP_1588_CLOCK)
 165
 166/**
 167 * ptp_clock_register() - register a PTP hardware clock driver
 168 *
 169 * @info:   Structure describing the new clock.
 170 * @parent: Pointer to the parent device of the new clock.
 171 *
 172 * Returns a valid pointer on success or PTR_ERR on failure.  If PHC
 173 * support is missing at the configuration level, this function
 174 * returns NULL, and drivers are expected to gracefully handle that
 175 * case separately.
 176 */
 177
 178extern struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
 179                                            struct device *parent);
 180
 181/**
 182 * ptp_clock_unregister() - unregister a PTP hardware clock driver
 183 *
 184 * @ptp:  The clock to remove from service.
 185 */
 186
 187extern int ptp_clock_unregister(struct ptp_clock *ptp);
 188
 189/**
 190 * ptp_clock_event() - notify the PTP layer about an event
 191 *
 192 * @ptp:    The clock obtained from ptp_clock_register().
 193 * @event:  Message structure describing the event.
 194 */
 195
 196extern void ptp_clock_event(struct ptp_clock *ptp,
 197                            struct ptp_clock_event *event);
 198
 199/**
 200 * ptp_clock_index() - obtain the device index of a PTP clock
 201 *
 202 * @ptp:    The clock obtained from ptp_clock_register().
 203 */
 204
 205extern int ptp_clock_index(struct ptp_clock *ptp);
 206
 207/**
 208 * ptp_find_pin() - obtain the pin index of a given auxiliary function
 209 *
 210 * @ptp:    The clock obtained from ptp_clock_register().
 211 * @func:   One of the ptp_pin_function enumerated values.
 212 * @chan:   The particular functional channel to find.
 213 * Return:  Pin index in the range of zero to ptp_clock_caps.n_pins - 1,
 214 *          or -1 if the auxiliary function cannot be found.
 215 */
 216
 217int ptp_find_pin(struct ptp_clock *ptp,
 218                 enum ptp_pin_function func, unsigned int chan);
 219
 220/**
 221 * ptp_schedule_worker() - schedule ptp auxiliary work
 222 *
 223 * @ptp:    The clock obtained from ptp_clock_register().
 224 * @delay:  number of jiffies to wait before queuing
 225 *          See kthread_queue_delayed_work() for more info.
 226 */
 227
 228int ptp_schedule_worker(struct ptp_clock *ptp, unsigned long delay);
 229
 230#else
 231static inline struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
 232                                                   struct device *parent)
 233{ return NULL; }
 234static inline int ptp_clock_unregister(struct ptp_clock *ptp)
 235{ return 0; }
 236static inline void ptp_clock_event(struct ptp_clock *ptp,
 237                                   struct ptp_clock_event *event)
 238{ }
 239static inline int ptp_clock_index(struct ptp_clock *ptp)
 240{ return -1; }
 241static inline int ptp_find_pin(struct ptp_clock *ptp,
 242                               enum ptp_pin_function func, unsigned int chan)
 243{ return -1; }
 244static inline int ptp_schedule_worker(struct ptp_clock *ptp,
 245                                      unsigned long delay)
 246{ return -EOPNOTSUPP; }
 247
 248#endif
 249
 250#endif
 251