Skip to content

Commit 80b816b

Browse files
committed
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
1 parent 57f0fcb commit 80b816b

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

include/linux/clockchips.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ extern void clockevents_config_and_register(struct clock_event_device *dev,
132132
u32 freq, unsigned long min_delta,
133133
unsigned long max_delta);
134134

135+
extern int clockevents_update_freq(struct clock_event_device *ce, u32 freq);
136+
135137
extern void clockevents_exchange_device(struct clock_event_device *old,
136138
struct clock_event_device *new);
137139
extern void clockevents_set_mode(struct clock_event_device *dev,

kernel/time/clockevents.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,26 @@ void clockevents_config_and_register(struct clock_event_device *dev,
238238
clockevents_register_device(dev);
239239
}
240240

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+
*/
251+
int 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+
241261
/*
242262
* Noop handler when we shut down an event device
243263
*/

0 commit comments

Comments
 (0)