ARM: local timers: introduce a new registration interface
In order to switch to a runtime selectable local timer, add a registration interface that timer drivers can use to register to the core. local_timer_setup() and local_timer_stop() are made weak symbols in order not to break existing setups. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>hifive-unleashed-5.1
parent
abde710ca8
commit
0ef330e10d
|
@ -15,6 +15,11 @@
|
||||||
|
|
||||||
struct clock_event_device;
|
struct clock_event_device;
|
||||||
|
|
||||||
|
struct local_timer_ops {
|
||||||
|
int (*setup)(struct clock_event_device *);
|
||||||
|
void (*stop)(struct clock_event_device *);
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup a per-cpu timer, whether it be a local timer or dummy broadcast
|
* Setup a per-cpu timer, whether it be a local timer or dummy broadcast
|
||||||
*/
|
*/
|
||||||
|
@ -38,6 +43,11 @@ void local_timer_stop(struct clock_event_device *);
|
||||||
*/
|
*/
|
||||||
int local_timer_setup(struct clock_event_device *);
|
int local_timer_setup(struct clock_event_device *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register a local timer driver
|
||||||
|
*/
|
||||||
|
int local_timer_register(struct local_timer_ops *);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline int local_timer_setup(struct clock_event_device *evt)
|
static inline int local_timer_setup(struct clock_event_device *evt)
|
||||||
|
@ -48,6 +58,11 @@ static inline int local_timer_setup(struct clock_event_device *evt)
|
||||||
static inline void local_timer_stop(struct clock_event_device *evt)
|
static inline void local_timer_stop(struct clock_event_device *evt)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int local_timer_register(struct local_timer_ops *ops)
|
||||||
|
{
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -459,6 +459,33 @@ static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt)
|
||||||
clockevents_register_device(evt);
|
clockevents_register_device(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct local_timer_ops *lt_ops;
|
||||||
|
|
||||||
|
#ifdef CONFIG_LOCAL_TIMERS
|
||||||
|
int local_timer_register(struct local_timer_ops *ops)
|
||||||
|
{
|
||||||
|
if (lt_ops)
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
|
lt_ops = ops;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int __cpuinit __attribute__ ((weak)) local_timer_setup(struct clock_event_device *clk)
|
||||||
|
{
|
||||||
|
if (lt_ops)
|
||||||
|
return lt_ops->setup(clk);
|
||||||
|
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __attribute__ ((weak)) local_timer_stop(struct clock_event_device *clk)
|
||||||
|
{
|
||||||
|
if (lt_ops)
|
||||||
|
lt_ops->stop(clk);
|
||||||
|
}
|
||||||
|
|
||||||
void __cpuinit percpu_timer_setup(void)
|
void __cpuinit percpu_timer_setup(void)
|
||||||
{
|
{
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = smp_processor_id();
|
||||||
|
|
Loading…
Reference in New Issue