mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 06:03:36 -04:00
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (62 commits) posix-clocks: Check write permissions in posix syscalls hrtimer: Remove empty hrtimer_init_hres_timer() hrtimer: Update hrtimer->state documentation hrtimer: Update base[CLOCK_BOOTTIME].offset correctly timers: Export CLOCK_BOOTTIME via the posix timers interface timers: Add CLOCK_BOOTTIME hrtimer base time: Extend get_xtime_and_monotonic_offset() to also return sleep time: Introduce get_monotonic_boottime and ktime_get_boottime hrtimers: extend hrtimer base code to handle more then 2 clockids ntp: Remove redundant and incorrect parameter check mn10300: Switch do_timer() to xtimer_update() posix clocks: Introduce dynamic clocks posix-timers: Cleanup namespace posix-timers: Add support for fd based clocks x86: Add clock_adjtime for x86 posix-timers: Introduce a syscall for clock tuning. time: Splitout compat timex accessors ntp: Add ADJ_SETOFFSET mode bit time: Introduce timekeeping_inject_offset posix-timer: Update comment ... Fix up new system-call-related conflicts in arch/x86/ia32/ia32entry.S arch/x86/include/asm/unistd_32.h arch/x86/include/asm/unistd_64.h arch/x86/kernel/syscall_table_32.S (name_to_handle_at()/open_by_handle_at() vs clock_adjtime()), and some due to movement of get_jiffies_64() in: kernel/time.c
This commit is contained in:
commit
420c1c572d
56 changed files with 1276 additions and 508 deletions
|
|
@ -54,11 +54,13 @@ enum hrtimer_restart {
|
|||
* 0x00 inactive
|
||||
* 0x01 enqueued into rbtree
|
||||
* 0x02 callback function running
|
||||
* 0x04 timer is migrated to another cpu
|
||||
*
|
||||
* Special cases:
|
||||
* 0x03 callback function running and enqueued
|
||||
* (was requeued on another CPU)
|
||||
* 0x09 timer was migrated on CPU hotunplug
|
||||
* 0x05 timer was migrated on CPU hotunplug
|
||||
*
|
||||
* The "callback function running and enqueued" status is only possible on
|
||||
* SMP. It happens for example when a posix timer expired and the callback
|
||||
* queued a signal. Between dropping the lock which protects the posix timer
|
||||
|
|
@ -67,8 +69,11 @@ enum hrtimer_restart {
|
|||
* as otherwise the timer could be removed before the softirq code finishes the
|
||||
* the handling of the timer.
|
||||
*
|
||||
* The HRTIMER_STATE_ENQUEUED bit is always or'ed to the current state to
|
||||
* preserve the HRTIMER_STATE_CALLBACK bit in the above scenario.
|
||||
* The HRTIMER_STATE_ENQUEUED bit is always or'ed to the current state
|
||||
* to preserve the HRTIMER_STATE_CALLBACK in the above scenario. This
|
||||
* also affects HRTIMER_STATE_MIGRATE where the preservation is not
|
||||
* necessary. HRTIMER_STATE_MIGRATE is cleared after the timer is
|
||||
* enqueued on the new cpu.
|
||||
*
|
||||
* All state transitions are protected by cpu_base->lock.
|
||||
*/
|
||||
|
|
@ -148,7 +153,12 @@ struct hrtimer_clock_base {
|
|||
#endif
|
||||
};
|
||||
|
||||
#define HRTIMER_MAX_CLOCK_BASES 2
|
||||
enum hrtimer_base_type {
|
||||
HRTIMER_BASE_REALTIME,
|
||||
HRTIMER_BASE_MONOTONIC,
|
||||
HRTIMER_BASE_BOOTTIME,
|
||||
HRTIMER_MAX_CLOCK_BASES,
|
||||
};
|
||||
|
||||
/*
|
||||
* struct hrtimer_cpu_base - the per cpu clock bases
|
||||
|
|
@ -308,6 +318,7 @@ static inline int hrtimer_is_hres_active(struct hrtimer *timer)
|
|||
|
||||
extern ktime_t ktime_get(void);
|
||||
extern ktime_t ktime_get_real(void);
|
||||
extern ktime_t ktime_get_boottime(void);
|
||||
|
||||
|
||||
DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
|
||||
|
|
@ -370,8 +381,9 @@ extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
|
|||
extern ktime_t hrtimer_get_next_event(void);
|
||||
|
||||
/*
|
||||
* A timer is active, when it is enqueued into the rbtree or the callback
|
||||
* function is running.
|
||||
* A timer is active, when it is enqueued into the rbtree or the
|
||||
* callback function is running or it's in the state of being migrated
|
||||
* to another cpu.
|
||||
*/
|
||||
static inline int hrtimer_active(const struct hrtimer *timer)
|
||||
{
|
||||
|
|
|
|||
150
include/linux/posix-clock.h
Normal file
150
include/linux/posix-clock.h
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
/*
|
||||
* posix-clock.h - support for dynamic clock devices
|
||||
*
|
||||
* Copyright (C) 2010 OMICRON electronics GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#ifndef _LINUX_POSIX_CLOCK_H_
|
||||
#define _LINUX_POSIX_CLOCK_H_
|
||||
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/posix-timers.h>
|
||||
|
||||
struct posix_clock;
|
||||
|
||||
/**
|
||||
* struct posix_clock_operations - functional interface to the clock
|
||||
*
|
||||
* Every posix clock is represented by a character device. Drivers may
|
||||
* optionally offer extended capabilities by implementing the
|
||||
* character device methods. The character device file operations are
|
||||
* first handled by the clock device layer, then passed on to the
|
||||
* driver by calling these functions.
|
||||
*
|
||||
* @owner: The clock driver should set to THIS_MODULE
|
||||
* @clock_adjtime: Adjust the clock
|
||||
* @clock_gettime: Read the current time
|
||||
* @clock_getres: Get the clock resolution
|
||||
* @clock_settime: Set the current time value
|
||||
* @timer_create: Create a new timer
|
||||
* @timer_delete: Remove a previously created timer
|
||||
* @timer_gettime: Get remaining time and interval of a timer
|
||||
* @timer_setttime: Set a timer's initial expiration and interval
|
||||
* @fasync: Optional character device fasync method
|
||||
* @mmap: Optional character device mmap method
|
||||
* @open: Optional character device open method
|
||||
* @release: Optional character device release method
|
||||
* @ioctl: Optional character device ioctl method
|
||||
* @read: Optional character device read method
|
||||
* @poll: Optional character device poll method
|
||||
*/
|
||||
struct posix_clock_operations {
|
||||
struct module *owner;
|
||||
|
||||
int (*clock_adjtime)(struct posix_clock *pc, struct timex *tx);
|
||||
|
||||
int (*clock_gettime)(struct posix_clock *pc, struct timespec *ts);
|
||||
|
||||
int (*clock_getres) (struct posix_clock *pc, struct timespec *ts);
|
||||
|
||||
int (*clock_settime)(struct posix_clock *pc,
|
||||
const struct timespec *ts);
|
||||
|
||||
int (*timer_create) (struct posix_clock *pc, struct k_itimer *kit);
|
||||
|
||||
int (*timer_delete) (struct posix_clock *pc, struct k_itimer *kit);
|
||||
|
||||
void (*timer_gettime)(struct posix_clock *pc,
|
||||
struct k_itimer *kit, struct itimerspec *tsp);
|
||||
|
||||
int (*timer_settime)(struct posix_clock *pc,
|
||||
struct k_itimer *kit, int flags,
|
||||
struct itimerspec *tsp, struct itimerspec *old);
|
||||
/*
|
||||
* Optional character device methods:
|
||||
*/
|
||||
int (*fasync) (struct posix_clock *pc,
|
||||
int fd, struct file *file, int on);
|
||||
|
||||
long (*ioctl) (struct posix_clock *pc,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
int (*mmap) (struct posix_clock *pc,
|
||||
struct vm_area_struct *vma);
|
||||
|
||||
int (*open) (struct posix_clock *pc, fmode_t f_mode);
|
||||
|
||||
uint (*poll) (struct posix_clock *pc,
|
||||
struct file *file, poll_table *wait);
|
||||
|
||||
int (*release) (struct posix_clock *pc);
|
||||
|
||||
ssize_t (*read) (struct posix_clock *pc,
|
||||
uint flags, char __user *buf, size_t cnt);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct posix_clock - represents a dynamic posix clock
|
||||
*
|
||||
* @ops: Functional interface to the clock
|
||||
* @cdev: Character device instance for this clock
|
||||
* @kref: Reference count.
|
||||
* @mutex: Protects the 'zombie' field from concurrent access.
|
||||
* @zombie: If 'zombie' is true, then the hardware has disappeared.
|
||||
* @release: A function to free the structure when the reference count reaches
|
||||
* zero. May be NULL if structure is statically allocated.
|
||||
*
|
||||
* Drivers should embed their struct posix_clock within a private
|
||||
* structure, obtaining a reference to it during callbacks using
|
||||
* container_of().
|
||||
*/
|
||||
struct posix_clock {
|
||||
struct posix_clock_operations ops;
|
||||
struct cdev cdev;
|
||||
struct kref kref;
|
||||
struct mutex mutex;
|
||||
bool zombie;
|
||||
void (*release)(struct posix_clock *clk);
|
||||
};
|
||||
|
||||
/**
|
||||
* posix_clock_register() - register a new clock
|
||||
* @clk: Pointer to the clock. Caller must provide 'ops' and 'release'
|
||||
* @devid: Allocated device id
|
||||
*
|
||||
* A clock driver calls this function to register itself with the
|
||||
* clock device subsystem. If 'clk' points to dynamically allocated
|
||||
* memory, then the caller must provide a 'release' function to free
|
||||
* that memory.
|
||||
*
|
||||
* Returns zero on success, non-zero otherwise.
|
||||
*/
|
||||
int posix_clock_register(struct posix_clock *clk, dev_t devid);
|
||||
|
||||
/**
|
||||
* posix_clock_unregister() - unregister a clock
|
||||
* @clk: Clock instance previously registered via posix_clock_register()
|
||||
*
|
||||
* A clock driver calls this function to remove itself from the clock
|
||||
* device subsystem. The posix_clock itself will remain (in an
|
||||
* inactive state) until its reference count drops to zero, at which
|
||||
* point it will be deallocated with its 'release' method.
|
||||
*/
|
||||
void posix_clock_unregister(struct posix_clock *clk);
|
||||
|
||||
#endif
|
||||
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/timex.h>
|
||||
|
||||
union cpu_time_count {
|
||||
cputime_t cpu;
|
||||
|
|
@ -17,10 +18,21 @@ struct cpu_timer_list {
|
|||
int firing;
|
||||
};
|
||||
|
||||
/*
|
||||
* Bit fields within a clockid:
|
||||
*
|
||||
* The most significant 29 bits hold either a pid or a file descriptor.
|
||||
*
|
||||
* Bit 2 indicates whether a cpu clock refers to a thread or a process.
|
||||
*
|
||||
* Bits 1 and 0 give the type: PROF=0, VIRT=1, SCHED=2, or FD=3.
|
||||
*
|
||||
* A clockid is invalid if bits 2, 1, and 0 are all set.
|
||||
*/
|
||||
#define CPUCLOCK_PID(clock) ((pid_t) ~((clock) >> 3))
|
||||
#define CPUCLOCK_PERTHREAD(clock) \
|
||||
(((clock) & (clockid_t) CPUCLOCK_PERTHREAD_MASK) != 0)
|
||||
#define CPUCLOCK_PID_MASK 7
|
||||
|
||||
#define CPUCLOCK_PERTHREAD_MASK 4
|
||||
#define CPUCLOCK_WHICH(clock) ((clock) & (clockid_t) CPUCLOCK_CLOCK_MASK)
|
||||
#define CPUCLOCK_CLOCK_MASK 3
|
||||
|
|
@ -28,12 +40,17 @@ struct cpu_timer_list {
|
|||
#define CPUCLOCK_VIRT 1
|
||||
#define CPUCLOCK_SCHED 2
|
||||
#define CPUCLOCK_MAX 3
|
||||
#define CLOCKFD CPUCLOCK_MAX
|
||||
#define CLOCKFD_MASK (CPUCLOCK_PERTHREAD_MASK|CPUCLOCK_CLOCK_MASK)
|
||||
|
||||
#define MAKE_PROCESS_CPUCLOCK(pid, clock) \
|
||||
((~(clockid_t) (pid) << 3) | (clockid_t) (clock))
|
||||
#define MAKE_THREAD_CPUCLOCK(tid, clock) \
|
||||
MAKE_PROCESS_CPUCLOCK((tid), (clock) | CPUCLOCK_PERTHREAD_MASK)
|
||||
|
||||
#define FD_TO_CLOCKID(fd) ((~(clockid_t) (fd) << 3) | CLOCKFD)
|
||||
#define CLOCKID_TO_FD(clk) ((unsigned int) ~((clk) >> 3))
|
||||
|
||||
/* POSIX.1b interval timer structure. */
|
||||
struct k_itimer {
|
||||
struct list_head list; /* free/ allocate list */
|
||||
|
|
@ -67,10 +84,11 @@ struct k_itimer {
|
|||
};
|
||||
|
||||
struct k_clock {
|
||||
int res; /* in nanoseconds */
|
||||
int (*clock_getres) (const clockid_t which_clock, struct timespec *tp);
|
||||
int (*clock_set) (const clockid_t which_clock, struct timespec * tp);
|
||||
int (*clock_set) (const clockid_t which_clock,
|
||||
const struct timespec *tp);
|
||||
int (*clock_get) (const clockid_t which_clock, struct timespec * tp);
|
||||
int (*clock_adj) (const clockid_t which_clock, struct timex *tx);
|
||||
int (*timer_create) (struct k_itimer *timer);
|
||||
int (*nsleep) (const clockid_t which_clock, int flags,
|
||||
struct timespec *, struct timespec __user *);
|
||||
|
|
@ -84,28 +102,14 @@ struct k_clock {
|
|||
struct itimerspec * cur_setting);
|
||||
};
|
||||
|
||||
void register_posix_clock(const clockid_t clock_id, struct k_clock *new_clock);
|
||||
extern struct k_clock clock_posix_cpu;
|
||||
extern struct k_clock clock_posix_dynamic;
|
||||
|
||||
/* error handlers for timer_create, nanosleep and settime */
|
||||
int do_posix_clock_nonanosleep(const clockid_t, int flags, struct timespec *,
|
||||
struct timespec __user *);
|
||||
int do_posix_clock_nosettime(const clockid_t, struct timespec *tp);
|
||||
void posix_timers_register_clock(const clockid_t clock_id, struct k_clock *new_clock);
|
||||
|
||||
/* function to call to trigger timer event */
|
||||
int posix_timer_event(struct k_itimer *timr, int si_private);
|
||||
|
||||
int posix_cpu_clock_getres(const clockid_t which_clock, struct timespec *ts);
|
||||
int posix_cpu_clock_get(const clockid_t which_clock, struct timespec *ts);
|
||||
int posix_cpu_clock_set(const clockid_t which_clock, const struct timespec *ts);
|
||||
int posix_cpu_timer_create(struct k_itimer *timer);
|
||||
int posix_cpu_nsleep(const clockid_t which_clock, int flags,
|
||||
struct timespec *rqtp, struct timespec __user *rmtp);
|
||||
long posix_cpu_nsleep_restart(struct restart_block *restart_block);
|
||||
int posix_cpu_timer_set(struct k_itimer *timer, int flags,
|
||||
struct itimerspec *new, struct itimerspec *old);
|
||||
int posix_cpu_timer_del(struct k_itimer *timer);
|
||||
void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp);
|
||||
|
||||
void posix_cpu_timer_schedule(struct k_itimer *timer);
|
||||
|
||||
void run_posix_cpu_timers(struct task_struct *task);
|
||||
|
|
|
|||
|
|
@ -2046,7 +2046,7 @@ extern void release_uids(struct user_namespace *ns);
|
|||
|
||||
#include <asm/current.h>
|
||||
|
||||
extern void do_timer(unsigned long ticks);
|
||||
extern void xtime_update(unsigned long ticks);
|
||||
|
||||
extern int wake_up_state(struct task_struct *tsk, unsigned int state);
|
||||
extern int wake_up_process(struct task_struct *tsk);
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ struct audit_krule;
|
|||
*/
|
||||
extern int cap_capable(struct task_struct *tsk, const struct cred *cred,
|
||||
int cap, int audit);
|
||||
extern int cap_settime(struct timespec *ts, struct timezone *tz);
|
||||
extern int cap_settime(const struct timespec *ts, const struct timezone *tz);
|
||||
extern int cap_ptrace_access_check(struct task_struct *child, unsigned int mode);
|
||||
extern int cap_ptrace_traceme(struct task_struct *parent);
|
||||
extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted);
|
||||
|
|
@ -1387,7 +1387,7 @@ struct security_operations {
|
|||
int (*quotactl) (int cmds, int type, int id, struct super_block *sb);
|
||||
int (*quota_on) (struct dentry *dentry);
|
||||
int (*syslog) (int type);
|
||||
int (*settime) (struct timespec *ts, struct timezone *tz);
|
||||
int (*settime) (const struct timespec *ts, const struct timezone *tz);
|
||||
int (*vm_enough_memory) (struct mm_struct *mm, long pages);
|
||||
|
||||
int (*bprm_set_creds) (struct linux_binprm *bprm);
|
||||
|
|
@ -1669,7 +1669,7 @@ int security_sysctl(struct ctl_table *table, int op);
|
|||
int security_quotactl(int cmds, int type, int id, struct super_block *sb);
|
||||
int security_quota_on(struct dentry *dentry);
|
||||
int security_syslog(int type);
|
||||
int security_settime(struct timespec *ts, struct timezone *tz);
|
||||
int security_settime(const struct timespec *ts, const struct timezone *tz);
|
||||
int security_vm_enough_memory(long pages);
|
||||
int security_vm_enough_memory_mm(struct mm_struct *mm, long pages);
|
||||
int security_vm_enough_memory_kern(long pages);
|
||||
|
|
@ -1904,7 +1904,8 @@ static inline int security_syslog(int type)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_settime(struct timespec *ts, struct timezone *tz)
|
||||
static inline int security_settime(const struct timespec *ts,
|
||||
const struct timezone *tz)
|
||||
{
|
||||
return cap_settime(ts, tz);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -316,6 +316,8 @@ asmlinkage long sys_clock_settime(clockid_t which_clock,
|
|||
const struct timespec __user *tp);
|
||||
asmlinkage long sys_clock_gettime(clockid_t which_clock,
|
||||
struct timespec __user *tp);
|
||||
asmlinkage long sys_clock_adjtime(clockid_t which_clock,
|
||||
struct timex __user *tx);
|
||||
asmlinkage long sys_clock_getres(clockid_t which_clock,
|
||||
struct timespec __user *tp);
|
||||
asmlinkage long sys_clock_nanosleep(clockid_t which_clock, int flags,
|
||||
|
|
|
|||
|
|
@ -18,9 +18,6 @@ struct compat_timespec;
|
|||
struct restart_block {
|
||||
long (*fn)(struct restart_block *);
|
||||
union {
|
||||
struct {
|
||||
unsigned long arg0, arg1, arg2, arg3;
|
||||
};
|
||||
/* For futex_wait and futex_wait_requeue_pi */
|
||||
struct {
|
||||
u32 __user *uaddr;
|
||||
|
|
|
|||
|
|
@ -113,8 +113,6 @@ static inline struct timespec timespec_sub(struct timespec lhs,
|
|||
#define timespec_valid(ts) \
|
||||
(((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
|
||||
|
||||
extern seqlock_t xtime_lock;
|
||||
|
||||
extern void read_persistent_clock(struct timespec *ts);
|
||||
extern void read_boot_clock(struct timespec *ts);
|
||||
extern int update_persistent_clock(struct timespec now);
|
||||
|
|
@ -125,8 +123,9 @@ extern int timekeeping_suspended;
|
|||
unsigned long get_seconds(void);
|
||||
struct timespec current_kernel_time(void);
|
||||
struct timespec __current_kernel_time(void); /* does not take xtime_lock */
|
||||
struct timespec __get_wall_to_monotonic(void); /* does not take xtime_lock */
|
||||
struct timespec get_monotonic_coarse(void);
|
||||
void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,
|
||||
struct timespec *wtom, struct timespec *sleep);
|
||||
|
||||
#define CURRENT_TIME (current_kernel_time())
|
||||
#define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 })
|
||||
|
|
@ -147,8 +146,9 @@ static inline u32 arch_gettimeoffset(void) { return 0; }
|
|||
#endif
|
||||
|
||||
extern void do_gettimeofday(struct timeval *tv);
|
||||
extern int do_settimeofday(struct timespec *tv);
|
||||
extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
|
||||
extern int do_settimeofday(const struct timespec *tv);
|
||||
extern int do_sys_settimeofday(const struct timespec *tv,
|
||||
const struct timezone *tz);
|
||||
#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
|
||||
extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
|
||||
struct itimerval;
|
||||
|
|
@ -162,12 +162,13 @@ extern void getnstime_raw_and_real(struct timespec *ts_raw,
|
|||
struct timespec *ts_real);
|
||||
extern void getboottime(struct timespec *ts);
|
||||
extern void monotonic_to_bootbased(struct timespec *ts);
|
||||
extern void get_monotonic_boottime(struct timespec *ts);
|
||||
|
||||
extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
|
||||
extern int timekeeping_valid_for_hres(void);
|
||||
extern u64 timekeeping_max_deferment(void);
|
||||
extern void update_wall_time(void);
|
||||
extern void timekeeping_leap_insert(int leapsecond);
|
||||
extern int timekeeping_inject_offset(struct timespec *ts);
|
||||
|
||||
struct tms;
|
||||
extern void do_sys_times(struct tms *);
|
||||
|
|
@ -292,6 +293,7 @@ struct itimerval {
|
|||
#define CLOCK_MONOTONIC_RAW 4
|
||||
#define CLOCK_REALTIME_COARSE 5
|
||||
#define CLOCK_MONOTONIC_COARSE 6
|
||||
#define CLOCK_BOOTTIME 7
|
||||
|
||||
/*
|
||||
* The IDs of various hardware clocks:
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ struct timex {
|
|||
long tolerance; /* clock frequency tolerance (ppm)
|
||||
* (read only)
|
||||
*/
|
||||
struct timeval time; /* (read only) */
|
||||
struct timeval time; /* (read only, except for ADJ_SETOFFSET) */
|
||||
long tick; /* (modified) usecs between clock ticks */
|
||||
|
||||
long ppsfreq; /* pps frequency (scaled ppm) (ro) */
|
||||
|
|
@ -102,6 +102,7 @@ struct timex {
|
|||
#define ADJ_STATUS 0x0010 /* clock status */
|
||||
#define ADJ_TIMECONST 0x0020 /* pll time constant */
|
||||
#define ADJ_TAI 0x0080 /* set TAI offset */
|
||||
#define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */
|
||||
#define ADJ_MICRO 0x1000 /* select microsecond resolution */
|
||||
#define ADJ_NANO 0x2000 /* select nanosecond resolution */
|
||||
#define ADJ_TICK 0x4000 /* tick value */
|
||||
|
|
|
|||
Loading…
Reference in a new issue