diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-15 15:13:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-15 15:13:56 -0400 |
commit | 8a284c062ec923c924c79e3b1b5199b8d72904fc (patch) | |
tree | aa016cb632e01e4b3c989db102137a87adc5b239 /drivers/ptp | |
parent | 208de21477679175384b5dc1e6dcf97bd568e8cb (diff) | |
parent | 6436257b491cc0d456c39330dfc22126148d5ed7 (diff) |
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner:
"The timer department delivers this time:
- Support for cross clock domain timestamps in the core code plus a
first user. That allows more precise timestamping for PTP and
later for audio and other peripherals.
The ptp/e1000e patches have been acked by the relevant maintainers
and are carried in the timer tree to avoid merge ordering issues.
- Support for unregistering the current clocksource watchdog. That
lifts a limitation for switching clocksources which has been there
from day 1
- The usual pile of fixes and updates to the core and the drivers.
Nothing outstanding and exciting"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (26 commits)
time/timekeeping: Work around false positive GCC warning
e1000e: Adds hardware supported cross timestamp on e1000e nic
ptp: Add PTP_SYS_OFFSET_PRECISE for driver crosstimestamping
x86/tsc: Always Running Timer (ART) correlated clocksource
hrtimer: Revert CLOCK_MONOTONIC_RAW support
time: Add history to cross timestamp interface supporting slower devices
time: Add driver cross timestamp interface for higher precision time synchronization
time: Remove duplicated code in ktime_get_raw_and_real()
time: Add timekeeping snapshot code capturing system time and counter
time: Add cycles to nanoseconds translation
jiffies: Use CLOCKSOURCE_MASK instead of constant
clocksource: Introduce clocksource_freq2mult()
clockevents/drivers/exynos_mct: Implement ->set_state_oneshot_stopped()
clockevents/drivers/arm_global_timer: Implement ->set_state_oneshot_stopped()
clockevents/drivers/arm_arch_timer: Implement ->set_state_oneshot_stopped()
clocksource/drivers/arm_global_timer: Register delay timer
clocksource/drivers/lpc32xx: Support timer-based ARM delay
clocksource/drivers/lpc32xx: Support periodic mode
clocksource/drivers/lpc32xx: Don't use the prescaler counter for clockevents
clocksource/drivers/rockchip: Add err handle for rk_timer_init
...
Diffstat (limited to 'drivers/ptp')
-rw-r--r-- | drivers/ptp/ptp_chardev.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c index da7bae991552..579fd65299a0 100644 --- a/drivers/ptp/ptp_chardev.c +++ b/drivers/ptp/ptp_chardev.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/poll.h> | 22 | #include <linux/poll.h> |
23 | #include <linux/sched.h> | 23 | #include <linux/sched.h> |
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/timekeeping.h> | ||
25 | 26 | ||
26 | #include "ptp_private.h" | 27 | #include "ptp_private.h" |
27 | 28 | ||
@@ -120,11 +121,13 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) | |||
120 | struct ptp_clock_caps caps; | 121 | struct ptp_clock_caps caps; |
121 | struct ptp_clock_request req; | 122 | struct ptp_clock_request req; |
122 | struct ptp_sys_offset *sysoff = NULL; | 123 | struct ptp_sys_offset *sysoff = NULL; |
124 | struct ptp_sys_offset_precise precise_offset; | ||
123 | struct ptp_pin_desc pd; | 125 | struct ptp_pin_desc pd; |
124 | struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); | 126 | struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); |
125 | struct ptp_clock_info *ops = ptp->info; | 127 | struct ptp_clock_info *ops = ptp->info; |
126 | struct ptp_clock_time *pct; | 128 | struct ptp_clock_time *pct; |
127 | struct timespec64 ts; | 129 | struct timespec64 ts; |
130 | struct system_device_crosststamp xtstamp; | ||
128 | int enable, err = 0; | 131 | int enable, err = 0; |
129 | unsigned int i, pin_index; | 132 | unsigned int i, pin_index; |
130 | 133 | ||
@@ -138,6 +141,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) | |||
138 | caps.n_per_out = ptp->info->n_per_out; | 141 | caps.n_per_out = ptp->info->n_per_out; |
139 | caps.pps = ptp->info->pps; | 142 | caps.pps = ptp->info->pps; |
140 | caps.n_pins = ptp->info->n_pins; | 143 | caps.n_pins = ptp->info->n_pins; |
144 | caps.cross_timestamping = ptp->info->getcrosststamp != NULL; | ||
141 | if (copy_to_user((void __user *)arg, &caps, sizeof(caps))) | 145 | if (copy_to_user((void __user *)arg, &caps, sizeof(caps))) |
142 | err = -EFAULT; | 146 | err = -EFAULT; |
143 | break; | 147 | break; |
@@ -180,6 +184,29 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) | |||
180 | err = ops->enable(ops, &req, enable); | 184 | err = ops->enable(ops, &req, enable); |
181 | break; | 185 | break; |
182 | 186 | ||
187 | case PTP_SYS_OFFSET_PRECISE: | ||
188 | if (!ptp->info->getcrosststamp) { | ||
189 | err = -EOPNOTSUPP; | ||
190 | break; | ||
191 | } | ||
192 | err = ptp->info->getcrosststamp(ptp->info, &xtstamp); | ||
193 | if (err) | ||
194 | break; | ||
195 | |||
196 | ts = ktime_to_timespec64(xtstamp.device); | ||
197 | precise_offset.device.sec = ts.tv_sec; | ||
198 | precise_offset.device.nsec = ts.tv_nsec; | ||
199 | ts = ktime_to_timespec64(xtstamp.sys_realtime); | ||
200 | precise_offset.sys_realtime.sec = ts.tv_sec; | ||
201 | precise_offset.sys_realtime.nsec = ts.tv_nsec; | ||
202 | ts = ktime_to_timespec64(xtstamp.sys_monoraw); | ||
203 | precise_offset.sys_monoraw.sec = ts.tv_sec; | ||
204 | precise_offset.sys_monoraw.nsec = ts.tv_nsec; | ||
205 | if (copy_to_user((void __user *)arg, &precise_offset, | ||
206 | sizeof(precise_offset))) | ||
207 | err = -EFAULT; | ||
208 | break; | ||
209 | |||
183 | case PTP_SYS_OFFSET: | 210 | case PTP_SYS_OFFSET: |
184 | sysoff = kmalloc(sizeof(*sysoff), GFP_KERNEL); | 211 | sysoff = kmalloc(sizeof(*sysoff), GFP_KERNEL); |
185 | if (!sysoff) { | 212 | if (!sysoff) { |