diff options
Diffstat (limited to 'drivers/clocksource/time-armada-370-xp.c')
| -rw-r--r-- | drivers/clocksource/time-armada-370-xp.c | 40 | 
1 files changed, 18 insertions, 22 deletions
diff --git a/drivers/clocksource/time-armada-370-xp.c b/drivers/clocksource/time-armada-370-xp.c index 0198504ef6b..0451e62fac7 100644 --- a/drivers/clocksource/time-armada-370-xp.c +++ b/drivers/clocksource/time-armada-370-xp.c @@ -76,6 +76,7 @@  static void __iomem *timer_base, *local_base;  static unsigned int timer_clk;  static bool timer25Mhz = true; +static u32 enable_mask;  /*   * Number of timer ticks per jiffy. @@ -84,19 +85,13 @@ static u32 ticks_per_jiffy;  static struct clock_event_device __percpu *armada_370_xp_evt; -static void timer_ctrl_clrset(u32 clr, u32 set) -{ -	writel((readl(timer_base + TIMER_CTRL_OFF) & ~clr) | set, -		timer_base + TIMER_CTRL_OFF); -} -  static void local_timer_ctrl_clrset(u32 clr, u32 set)  {  	writel((readl(local_base + TIMER_CTRL_OFF) & ~clr) | set,  		local_base + TIMER_CTRL_OFF);  } -static u32 notrace armada_370_xp_read_sched_clock(void) +static u64 notrace armada_370_xp_read_sched_clock(void)  {  	return ~readl(timer_base + TIMER0_VAL_OFF);  } @@ -121,8 +116,7 @@ armada_370_xp_clkevt_next_event(unsigned long delta,  	/*  	 * Enable the timer.  	 */ -	local_timer_ctrl_clrset(TIMER0_RELOAD_EN, -				TIMER0_EN | TIMER0_DIV(TIMER_DIVIDER_SHIFT)); +	local_timer_ctrl_clrset(TIMER0_RELOAD_EN, enable_mask);  	return 0;  } @@ -141,9 +135,7 @@ armada_370_xp_clkevt_mode(enum clock_event_mode mode,  		/*  		 * Enable timer.  		 */ -		local_timer_ctrl_clrset(0, TIMER0_RELOAD_EN | -					   TIMER0_EN | -					   TIMER0_DIV(TIMER_DIVIDER_SHIFT)); +		local_timer_ctrl_clrset(0, TIMER0_RELOAD_EN | enable_mask);  	} else {  		/*  		 * Disable timer. @@ -240,11 +232,14 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np)  	WARN_ON(!timer_base);  	local_base = of_iomap(np, 1); -	if (timer25Mhz) +	if (timer25Mhz) {  		set = TIMER0_25MHZ;		 -	else +		enable_mask = TIMER0_EN; +	} else {  		clr = TIMER0_25MHZ; -	timer_ctrl_clrset(clr, set); +		enable_mask = TIMER0_EN | TIMER0_DIV(TIMER_DIVIDER_SHIFT); +	} +	atomic_io_modify(timer_base + TIMER_CTRL_OFF, clr | set, set);  	local_timer_ctrl_clrset(clr, set);  	/* @@ -256,19 +251,20 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np)  	ticks_per_jiffy = (timer_clk + HZ / 2) / HZ;  	/* -	 * Set scale and timer for sched_clock. -	 */ -	setup_sched_clock(armada_370_xp_read_sched_clock, 32, timer_clk); - -	/*  	 * Setup free-running clocksource timer (interrupts  	 * disabled).  	 */  	writel(0xffffffff, timer_base + TIMER0_VAL_OFF);  	writel(0xffffffff, timer_base + TIMER0_RELOAD_OFF); -	timer_ctrl_clrset(0, TIMER0_EN | TIMER0_RELOAD_EN | -			     TIMER0_DIV(TIMER_DIVIDER_SHIFT)); +	atomic_io_modify(timer_base + TIMER_CTRL_OFF, +		TIMER0_RELOAD_EN | enable_mask, +		TIMER0_RELOAD_EN | enable_mask); + +	/* +	 * Set scale and timer for sched_clock. +	 */ +	sched_clock_register(armada_370_xp_read_sched_clock, 32, timer_clk);  	clocksource_mmio_init(timer_base + TIMER0_VAL_OFF,  			      "armada_370_xp_clocksource",  | 
