aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2011-05-18 17:33:42 -0400
committerThomas Gleixner <tglx@linutronix.de>2011-05-19 08:24:16 -0400
commit80b816b736cfa5b9582279127099b20a479ab7d9 (patch)
tree94a2963c05e8e24d6153a0a2fae2f43fe05605bc
parent57f0fcbe1dea8a36c9d1673086326059991c5f81 (diff)
clockevents: Provide interface to reconfigure an active clock event device
Some ARM SoCs have clock event devices which have their frequency modified due to frequency scaling. Provide an interface which allows to reconfigure an active device. After reconfiguration reprogram the current pending event. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: LAK <linux-arm-kernel@lists.infradead.org> Cc: John Stultz <john.stultz@linaro.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Ingo Molnar <mingo@elte.hu> Link: http://lkml.kernel.org/r/%3C20110518210136.437459958%40linutronix.de%3E
-rw-r--r--include/linux/clockchips.h2
-rw-r--r--kernel/time/clockevents.c20
2 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
index 80acc79e0dc5..d6733e27af34 100644
--- a/include/linux/clockchips.h
+++ b/include/linux/clockchips.h
@@ -132,6 +132,8 @@ extern void clockevents_config_and_register(struct clock_event_device *dev,
132 u32 freq, unsigned long min_delta, 132 u32 freq, unsigned long min_delta,
133 unsigned long max_delta); 133 unsigned long max_delta);
134 134
135extern int clockevents_update_freq(struct clock_event_device *ce, u32 freq);
136
135extern void clockevents_exchange_device(struct clock_event_device *old, 137extern void clockevents_exchange_device(struct clock_event_device *old,
136 struct clock_event_device *new); 138 struct clock_event_device *new);
137extern void clockevents_set_mode(struct clock_event_device *dev, 139extern void clockevents_set_mode(struct clock_event_device *dev,
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
index c69e88c94446..22a9da9a9c96 100644
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -238,6 +238,26 @@ void clockevents_config_and_register(struct clock_event_device *dev,
238 clockevents_register_device(dev); 238 clockevents_register_device(dev);
239} 239}
240 240
241/**
242 * clockevents_update_freq - Update frequency and reprogram a clock event device.
243 * @dev: device to modify
244 * @freq: new device frequency
245 *
246 * Reconfigure and reprogram a clock event device in oneshot
247 * mode. Must be called on the cpu for which the device delivers per
248 * cpu timer events with interrupts disabled! Returns 0 on success,
249 * -ETIME when the event is in the past.
250 */
251int clockevents_update_freq(struct clock_event_device *dev, u32 freq)
252{
253 clockevents_config(dev, freq);
254
255 if (dev->mode != CLOCK_EVT_MODE_ONESHOT)
256 return 0;
257
258 return clockevents_program_event(dev, dev->next_event, ktime_get());
259}
260
241/* 261/*
242 * Noop handler when we shut down an event device 262 * Noop handler when we shut down an event device
243 */ 263 */