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>
This commit is contained in:
		
							parent
							
								
									abde710ca8
								
							
						
					
					
						commit
						0ef330e10d
					
				| @ -15,6 +15,11 @@ | ||||
| 
 | ||||
| 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 | ||||
|  */ | ||||
| @ -38,6 +43,11 @@ void local_timer_stop(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 | ||||
| 
 | ||||
| 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 int local_timer_register(struct local_timer_ops *ops) | ||||
| { | ||||
| 	return -ENXIO; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -459,6 +459,33 @@ static void __cpuinit broadcast_timer_setup(struct clock_event_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) | ||||
| { | ||||
| 	unsigned int cpu = smp_processor_id(); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user