diff options
| -rw-r--r-- | include/linux/clockchips.h | 10 | ||||
| -rw-r--r-- | kernel/time/clockevents.c | 4 | 
2 files changed, 11 insertions, 3 deletions
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 39bb050bdbb2..81e803e90aa4 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -45,20 +45,22 @@ enum clock_event_nofitiers {   */  #define CLOCK_EVT_FEAT_PERIODIC		0x000001  #define CLOCK_EVT_FEAT_ONESHOT		0x000002 +#define CLOCK_EVT_FEAT_KTIME		0x000004  /*   * x86(64) specific misfeatures:   *   * - Clockevent source stops in C3 State and needs broadcast support.   * - Local APIC timer is used as a dummy device.   */ -#define CLOCK_EVT_FEAT_C3STOP		0x000004 -#define CLOCK_EVT_FEAT_DUMMY		0x000008 +#define CLOCK_EVT_FEAT_C3STOP		0x000008 +#define CLOCK_EVT_FEAT_DUMMY		0x000010  /**   * struct clock_event_device - clock event device descriptor   * @event_handler:	Assigned by the framework to be called by the low   *			level handler of the event source - * @set_next_event:	set next event function + * @set_next_event:	set next event function using a clocksource delta + * @set_next_ktime:	set next event function using a direct ktime value   * @next_event:		local storage for the next event in oneshot mode   * @max_delta_ns:	maximum delta value in ns   * @min_delta_ns:	minimum delta value in ns @@ -81,6 +83,8 @@ struct clock_event_device {  	void			(*event_handler)(struct clock_event_device *);  	int			(*set_next_event)(unsigned long evt,  						  struct clock_event_device *); +	int			(*set_next_ktime)(ktime_t expires, +						  struct clock_event_device *);  	ktime_t			next_event;  	u64			max_delta_ns;  	u64			min_delta_ns; diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 713ef94eceef..1ecd6ba36d6c 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c @@ -216,6 +216,10 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires,  	if (dev->mode == CLOCK_EVT_MODE_SHUTDOWN)  		return 0; +	/* Shortcut for clockevent devices that can deal with ktime. */ +	if (dev->features & CLOCK_EVT_FEAT_KTIME) +		return dev->set_next_ktime(expires, dev); +  	delta = ktime_to_ns(ktime_sub(expires, ktime_get()));  	if (delta <= 0)  		return force ? clockevents_program_min_delta(dev) : -ETIME;  | 
