| Richard Cochran | d94ba80 | 2011-04-22 12:03:08 +0200 | [diff] [blame] | 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 |  | 
|  | 27 | struct 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 |  | 
|  | 74 | struct 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 |  | 
|  | 90 | struct ptp_clock; | 
|  | 91 |  | 
|  | 92 | /** | 
|  | 93 | * ptp_clock_register() - register a PTP hardware clock driver | 
|  | 94 | * | 
|  | 95 | * @info:  Structure describing the new clock. | 
|  | 96 | */ | 
|  | 97 |  | 
|  | 98 | extern 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 |  | 
|  | 106 | extern int ptp_clock_unregister(struct ptp_clock *ptp); | 
|  | 107 |  | 
|  | 108 |  | 
|  | 109 | enum 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 |  | 
|  | 123 | struct 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 |  | 
|  | 136 | extern void ptp_clock_event(struct ptp_clock *ptp, | 
|  | 137 | struct ptp_clock_event *event); | 
|  | 138 |  | 
|  | 139 | #endif |