Skip to content

Commit 57f0fcb

Browse files
committed
clockevents: Provide combined configure and register function
All clockevent devices have the same open coded initialization functions. Provide an interface which does all necessary initialization in the core code. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: John Stultz <john.stultz@linaro.org> Reviewed-by: Ingo Molnar <mingo@elte.hu> Link: http://lkml.kernel.org/r/%3C20110518210136.331975870%40linutronix.de%3E
1 parent 847b2f4 commit 57f0fcb

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

include/linux/clockchips.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ enum clock_event_nofitiers {
6969
* @retries: number of forced programming retries
7070
* @set_mode: set mode function
7171
* @broadcast: function to broadcast events
72+
* @min_delta_ticks: minimum delta value in ticks stored for reconfiguration
73+
* @max_delta_ticks: maximum delta value in ticks stored for reconfiguration
7274
* @name: ptr to clock event name
7375
* @rating: variable to rate clock event devices
7476
* @irq: IRQ number (only for non CPU local devices)
@@ -91,6 +93,9 @@ struct clock_event_device {
9193
void (*broadcast)(const struct cpumask *mask);
9294
void (*set_mode)(enum clock_event_mode mode,
9395
struct clock_event_device *);
96+
unsigned long min_delta_ticks;
97+
unsigned long max_delta_ticks;
98+
9499
const char *name;
95100
int rating;
96101
int irq;
@@ -123,6 +128,10 @@ extern u64 clockevent_delta2ns(unsigned long latch,
123128
struct clock_event_device *evt);
124129
extern void clockevents_register_device(struct clock_event_device *dev);
125130

131+
extern void clockevents_config_and_register(struct clock_event_device *dev,
132+
u32 freq, unsigned long min_delta,
133+
unsigned long max_delta);
134+
126135
extern void clockevents_exchange_device(struct clock_event_device *old,
127136
struct clock_event_device *new);
128137
extern void clockevents_set_mode(struct clock_event_device *dev,

kernel/time/clockevents.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,50 @@ void clockevents_register_device(struct clock_event_device *dev)
194194
}
195195
EXPORT_SYMBOL_GPL(clockevents_register_device);
196196

197+
static void clockevents_config(struct clock_event_device *dev,
198+
u32 freq)
199+
{
200+
unsigned long sec;
201+
202+
if (!(dev->features & CLOCK_EVT_FEAT_ONESHOT))
203+
return;
204+
205+
/*
206+
* Calculate the maximum number of seconds we can sleep. Limit
207+
* to 10 minutes for hardware which can program more than
208+
* 32bit ticks so we still get reasonable conversion values.
209+
*/
210+
sec = dev->max_delta_ticks;
211+
do_div(sec, freq);
212+
if (!sec)
213+
sec = 1;
214+
else if (sec > 600 && dev->max_delta_ticks > UINT_MAX)
215+
sec = 600;
216+
217+
clockevents_calc_mult_shift(dev, freq, sec);
218+
dev->min_delta_ns = clockevent_delta2ns(dev->min_delta_ticks, dev);
219+
dev->max_delta_ns = clockevent_delta2ns(dev->max_delta_ticks, dev);
220+
}
221+
222+
/**
223+
* clockevents_config_and_register - Configure and register a clock event device
224+
* @dev: device to register
225+
* @freq: The clock frequency
226+
* @min_delta: The minimum clock ticks to program in oneshot mode
227+
* @max_delta: The maximum clock ticks to program in oneshot mode
228+
*
229+
* min/max_delta can be 0 for devices which do not support oneshot mode.
230+
*/
231+
void clockevents_config_and_register(struct clock_event_device *dev,
232+
u32 freq, unsigned long min_delta,
233+
unsigned long max_delta)
234+
{
235+
dev->min_delta_ticks = min_delta;
236+
dev->max_delta_ticks = max_delta;
237+
clockevents_config(dev, freq);
238+
clockevents_register_device(dev);
239+
}
240+
197241
/*
198242
* Noop handler when we shut down an event device
199243
*/

0 commit comments

Comments
 (0)