diff options
-rw-r--r-- | arch/arm/kernel/smp_twd.c | 12 | ||||
-rw-r--r-- | arch/arm/plat-omap/counter_32k.c | 19 | ||||
-rw-r--r-- | include/linux/clockchips.h | 2 | ||||
-rw-r--r-- | kernel/time/clockevents.c | 24 |
4 files changed, 14 insertions, 43 deletions
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 27761ca..350a125 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -25,8 +25,6 @@ #include <asm/smp_twd.h> #include <asm/hardware/gic.h> -#define TWD_MIN_RANGE 4 - /* set up by the platform code */ void __iomem *twd_base; @@ -96,8 +94,7 @@ static void twd_update_frequency(void *data) { twd_timer_rate = clk_get_rate(twd_clk); - clockevents_reconfigure(__get_cpu_var(twd_ce), twd_timer_rate, - TWD_MIN_RANGE); + clockevents_update_freq(__get_cpu_var(twd_ce), twd_timer_rate); } static int twd_cpufreq_transition(struct notifier_block *nb, @@ -193,15 +190,10 @@ void __cpuinit twd_timer_setup(struct clock_event_device *clk) clk->set_mode = twd_set_mode; clk->set_next_event = twd_set_next_event; - clockevents_calc_mult_shift(clk, twd_timer_rate, TWD_MIN_RANGE); - - clk->max_delta_ns = clockevent_delta2ns(0xffffffff, clk); - clk->min_delta_ns = clockevent_delta2ns(0xf, clk); - /* Make sure our local interrupt controller has this enabled */ gic_enable_ppi(clk->irq); __get_cpu_var(twd_ce) = clk; - clockevents_register_device(clk); + clockevents_config_and_register(clk, twd_timer_rate, 0xf, 0xffffffff); } diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index f7fed60..ebe318e 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c @@ -152,22 +152,27 @@ static void notrace omap_update_sched_clock(void) * nsecs and adds to a monotonically increasing timespec. */ static struct timespec persistent_ts; -static cycles_t cycles, last_cycles; +static cycles_t cycles; +static DEFINE_SPINLOCK(read_persistent_clock_lock); void read_persistent_clock(struct timespec *ts) { unsigned long long nsecs; - cycles_t delta; - struct timespec *tsp = &persistent_ts; + cycles_t last_cycles; + unsigned long flags; + + spin_lock_irqsave(&read_persistent_clock_lock, flags); last_cycles = cycles; cycles = clocksource_32k.read(&clocksource_32k); - delta = cycles - last_cycles; - nsecs = clocksource_cyc2ns(delta, + nsecs = clocksource_cyc2ns(cycles - last_cycles, clocksource_32k.mult, clocksource_32k.shift); - timespec_add_ns(tsp, nsecs); - *ts = *tsp; + timespec_add_ns(&persistent_ts, nsecs); + + *ts = persistent_ts; + + spin_unlock_irqrestore(&read_persistent_clock_lock, flags); } int __init omap_init_clocksource_32k(void) diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 267ba73..d6733e2 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -144,8 +144,6 @@ extern int clockevents_program_event(struct clock_event_device *dev, extern void clockevents_handle_noop(struct clock_event_device *dev); -extern int clockevents_reconfigure(struct clock_event_device *ce, u32 freq, u32 minsec); - static inline void clockevents_calc_mult_shift(struct clock_event_device *ce, u32 freq, u32 minsec) { diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index a8a3d49..e4c699d 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c @@ -133,30 +133,6 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires, } /** - * clockevents_reconfigure - Reconfigure and reprogram a clock event device. - * @dev: device to modify - * @freq: new device frequency - * @secr: guaranteed runtime conversion range in seconds - * - * Reconfigure and reprogram a clock event device in oneshot - * mode. Must only be called from low level idle code where - * interaction with hrtimers/nohz code etc. is not possible and - * guaranteed not to conflict. Must be called with interrupts - * disabled! - * Returns 0 on success, -ETIME when the event is in the past or - * -EINVAL when called with invalid parameters. - */ -int clockevents_reconfigure(struct clock_event_device *dev, u32 freq, u32 secr) -{ - if (dev->mode != CLOCK_EVT_MODE_ONESHOT) - return -EINVAL; - - clockevents_calc_mult_shift(dev, freq, secr ? secr : 1); - - return clockevents_program_event(dev, dev->next_event, ktime_get()); -} - -/** * clockevents_register_notifier - register a clock events change listener */ int clockevents_register_notifier(struct notifier_block *nb) |