From e050822683f1819d614d64f0282ced2ee030a310 Mon Sep 17 00:00:00 2001 From: Richard Cochran Date: Wed, 31 Oct 2012 06:19:07 +0000 Subject: [PATCH] --- yaml --- r: 340575 b: refs/heads/master c: 215b13dd288c2e1e4461c1530a801f5f83e8cd90 h: refs/heads/master i: 340573: fd1c71a24df279dafbfe2c82cb7d8ad18f93d626 340571: da907ff5380027609178235769fb5f5170fe875d 340567: e261954da65ca5a131bca285c70629b35404689f 340559: 858ee76dbfe8b4774fd6eb29086ba228a6c47301 340543: bac38be20ddc906c9bbb3e2a859452e55dfd44ca v: v3 --- [refs] | 2 +- trunk/drivers/ptp/ptp_chardev.c | 32 ++++++++++++++++++++++++++++ trunk/include/uapi/linux/ptp_clock.h | 14 ++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index e0ee05ec3c31..b46dfd85d0e9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a24006ed12616bde1bbdb26868495906a212d8dc +refs/heads/master: 215b13dd288c2e1e4461c1530a801f5f83e8cd90 diff --git a/trunk/drivers/ptp/ptp_chardev.c b/trunk/drivers/ptp/ptp_chardev.c index e7f301da2902..4f8ae8057a7e 100644 --- a/trunk/drivers/ptp/ptp_chardev.c +++ b/trunk/drivers/ptp/ptp_chardev.c @@ -33,9 +33,13 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) { struct ptp_clock_caps caps; struct ptp_clock_request req; + struct ptp_sys_offset sysoff; struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock); struct ptp_clock_info *ops = ptp->info; + struct ptp_clock_time *pct; + struct timespec ts; int enable, err = 0; + unsigned int i; switch (cmd) { @@ -88,6 +92,34 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) err = ops->enable(ops, &req, enable); break; + case PTP_SYS_OFFSET: + if (copy_from_user(&sysoff, (void __user *)arg, + sizeof(sysoff))) { + err = -EFAULT; + break; + } + if (sysoff.n_samples > PTP_MAX_SAMPLES) { + err = -EINVAL; + break; + } + pct = &sysoff.ts[0]; + for (i = 0; i < sysoff.n_samples; i++) { + getnstimeofday(&ts); + pct->sec = ts.tv_sec; + pct->nsec = ts.tv_nsec; + pct++; + ptp->info->gettime(ptp->info, &ts); + pct->sec = ts.tv_sec; + pct->nsec = ts.tv_nsec; + pct++; + } + getnstimeofday(&ts); + pct->sec = ts.tv_sec; + pct->nsec = ts.tv_nsec; + if (copy_to_user((void __user *)arg, &sysoff, sizeof(sysoff))) + err = -EFAULT; + break; + default: err = -ENOTTY; break; diff --git a/trunk/include/uapi/linux/ptp_clock.h b/trunk/include/uapi/linux/ptp_clock.h index 94e981f810a2..b65c834f83e9 100644 --- a/trunk/include/uapi/linux/ptp_clock.h +++ b/trunk/include/uapi/linux/ptp_clock.h @@ -67,12 +67,26 @@ struct ptp_perout_request { unsigned int rsv[4]; /* Reserved for future use. */ }; +#define PTP_MAX_SAMPLES 25 /* Maximum allowed offset measurement samples. */ + +struct ptp_sys_offset { + unsigned int n_samples; /* Desired number of measurements. */ + unsigned int rsv[3]; /* Reserved for future use. */ + /* + * Array of interleaved system/phc time stamps. The kernel + * will provide 2*n_samples + 1 time stamps, with the last + * one as a system time stamp. + */ + struct ptp_clock_time ts[2 * PTP_MAX_SAMPLES + 1]; +}; + #define PTP_CLK_MAGIC '=' #define PTP_CLOCK_GETCAPS _IOR(PTP_CLK_MAGIC, 1, struct ptp_clock_caps) #define PTP_EXTTS_REQUEST _IOW(PTP_CLK_MAGIC, 2, struct ptp_extts_request) #define PTP_PEROUT_REQUEST _IOW(PTP_CLK_MAGIC, 3, struct ptp_perout_request) #define PTP_ENABLE_PPS _IOW(PTP_CLK_MAGIC, 4, int) +#define PTP_SYS_OFFSET _IOW(PTP_CLK_MAGIC, 5, struct ptp_sys_offset) struct ptp_extts_event { struct ptp_clock_time t; /* Time event occured. */