aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/kernel/smp_twd.c12
-rw-r--r--arch/arm/plat-omap/counter_32k.c19
-rw-r--r--include/linux/clockchips.h2
-rw-r--r--kernel/time/clockevents.c24
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)