ARM: timer-sp: add sched_clock support
Add a sched_clock support for the sp804 timer. The clocksource timer can optionally initialize itself as sched_clock timer. Signed-off-by: Rob Herring <rob.herring@calxeda.com>
This commit is contained in:
		
					parent
					
						
							
								d65b4e98d7
							
						
					
				
			
			
				commit
				
					
						a7bf616208
					
				
			
		
					 3 changed files with 31 additions and 2 deletions
				
			
		| 
						 | 
					@ -1127,6 +1127,7 @@ config PLAT_VERSATILE
 | 
				
			||||||
config ARM_TIMER_SP804
 | 
					config ARM_TIMER_SP804
 | 
				
			||||||
	bool
 | 
						bool
 | 
				
			||||||
	select CLKSRC_MMIO
 | 
						select CLKSRC_MMIO
 | 
				
			||||||
 | 
						select HAVE_SCHED_CLOCK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source arch/arm/mm/Kconfig
 | 
					source arch/arm/mm/Kconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,7 @@
 | 
				
			||||||
#include <linux/irq.h>
 | 
					#include <linux/irq.h>
 | 
				
			||||||
#include <linux/io.h>
 | 
					#include <linux/io.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/sched_clock.h>
 | 
				
			||||||
#include <asm/hardware/arm_timer.h>
 | 
					#include <asm/hardware/arm_timer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static long __init sp804_get_clock_rate(const char *name)
 | 
					static long __init sp804_get_clock_rate(const char *name)
 | 
				
			||||||
| 
						 | 
					@ -67,7 +68,16 @@ static long __init sp804_get_clock_rate(const char *name)
 | 
				
			||||||
	return rate;
 | 
						return rate;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void __init sp804_clocksource_init(void __iomem *base, const char *name)
 | 
					static void __iomem *sched_clock_base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static u32 sp804_read(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ~readl_relaxed(sched_clock_base + TIMER_VALUE);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void __init __sp804_clocksource_and_sched_clock_init(void __iomem *base,
 | 
				
			||||||
 | 
											     const char *name,
 | 
				
			||||||
 | 
											     int use_sched_clock)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	long rate = sp804_get_clock_rate(name);
 | 
						long rate = sp804_get_clock_rate(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,6 +93,11 @@ void __init sp804_clocksource_init(void __iomem *base, const char *name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clocksource_mmio_init(base + TIMER_VALUE, name,
 | 
						clocksource_mmio_init(base + TIMER_VALUE, name,
 | 
				
			||||||
		rate, 200, 32, clocksource_mmio_readl_down);
 | 
							rate, 200, 32, clocksource_mmio_readl_down);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (use_sched_clock) {
 | 
				
			||||||
 | 
							sched_clock_base = base;
 | 
				
			||||||
 | 
							setup_sched_clock(sp804_read, 32, rate);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +1,15 @@
 | 
				
			||||||
void sp804_clocksource_init(void __iomem *, const char *);
 | 
					void __sp804_clocksource_and_sched_clock_init(void __iomem *,
 | 
				
			||||||
 | 
										      const char *, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void sp804_clocksource_init(void __iomem *base, const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__sp804_clocksource_and_sched_clock_init(base, name, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void sp804_clocksource_and_sched_clock_init(void __iomem *base,
 | 
				
			||||||
 | 
												  const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__sp804_clocksource_and_sched_clock_init(base, name, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sp804_clockevents_init(void __iomem *, unsigned int, const char *);
 | 
					void sp804_clockevents_init(void __iomem *, unsigned int, const char *);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue