|  |  | 
|  | * PTP hardware clock infrastructure for Linux | 
|  |  | 
|  | This patch set introduces support for IEEE 1588 PTP clocks in | 
|  | Linux. Together with the SO_TIMESTAMPING socket options, this | 
|  | presents a standardized method for developing PTP user space | 
|  | programs, synchronizing Linux with external clocks, and using the | 
|  | ancillary features of PTP hardware clocks. | 
|  |  | 
|  | A new class driver exports a kernel interface for specific clock | 
|  | drivers and a user space interface. The infrastructure supports a | 
|  | complete set of PTP hardware clock functionality. | 
|  |  | 
|  | + Basic clock operations | 
|  | - Set time | 
|  | - Get time | 
|  | - Shift the clock by a given offset atomically | 
|  | - Adjust clock frequency | 
|  |  | 
|  | + Ancillary clock features | 
|  | - One short or periodic alarms, with signal delivery to user program | 
|  | - Time stamp external events | 
|  | - Period output signals configurable from user space | 
|  | - Synchronization of the Linux system time via the PPS subsystem | 
|  |  | 
|  | ** PTP hardware clock kernel API | 
|  |  | 
|  | A PTP clock driver registers itself with the class driver. The | 
|  | class driver handles all of the dealings with user space. The | 
|  | author of a clock driver need only implement the details of | 
|  | programming the clock hardware. The clock driver notifies the class | 
|  | driver of asynchronous events (alarms and external time stamps) via | 
|  | a simple message passing interface. | 
|  |  | 
|  | The class driver supports multiple PTP clock drivers. In normal use | 
|  | cases, only one PTP clock is needed. However, for testing and | 
|  | development, it can be useful to have more than one clock in a | 
|  | single system, in order to allow performance comparisons. | 
|  |  | 
|  | ** PTP hardware clock user space API | 
|  |  | 
|  | The class driver also creates a character device for each | 
|  | registered clock. User space can use an open file descriptor from | 
|  | the character device as a POSIX clock id and may call | 
|  | clock_gettime, clock_settime, and clock_adjtime.  These calls | 
|  | implement the basic clock operations. | 
|  |  | 
|  | User space programs may control the clock using standardized | 
|  | ioctls. A program may query, enable, configure, and disable the | 
|  | ancillary clock features. User space can receive time stamped | 
|  | events via blocking read() and poll(). One shot and periodic | 
|  | signals may be configured via the POSIX timer_settime() system | 
|  | call. | 
|  |  | 
|  | ** Writing clock drivers | 
|  |  | 
|  | Clock drivers include include/linux/ptp_clock_kernel.h and register | 
|  | themselves by presenting a 'struct ptp_clock_info' to the | 
|  | registration method. Clock drivers must implement all of the | 
|  | functions in the interface. If a clock does not offer a particular | 
|  | ancillary feature, then the driver should just return -EOPNOTSUPP | 
|  | from those functions. | 
|  |  | 
|  | Drivers must ensure that all of the methods in interface are | 
|  | reentrant. Since most hardware implementations treat the time value | 
|  | as a 64 bit integer accessed as two 32 bit registers, drivers | 
|  | should use spin_lock_irqsave/spin_unlock_irqrestore to protect | 
|  | against concurrent access. This locking cannot be accomplished in | 
|  | class driver, since the lock may also be needed by the clock | 
|  | driver's interrupt service routine. | 
|  |  | 
|  | ** Supported hardware | 
|  |  | 
|  | + Freescale eTSEC gianfar | 
|  | - 2 Time stamp external triggers, programmable polarity (opt. interrupt) | 
|  | - 2 Alarm registers (optional interrupt) | 
|  | - 3 Periodic signals (optional interrupt) | 
|  |  | 
|  | + National DP83640 | 
|  | - 6 GPIOs programmable as inputs or outputs | 
|  | - 6 GPIOs with dedicated functions (LED/JTAG/clock) can also be | 
|  | used as general inputs or outputs | 
|  | - GPIO inputs can time stamp external triggers | 
|  | - GPIO outputs can produce periodic signals | 
|  | - 1 interrupt pin | 
|  |  | 
|  | + Intel IXP465 | 
|  | - Auxiliary Slave/Master Mode Snapshot (optional interrupt) | 
|  | - Target Time (optional interrupt) |