diff options
| author | Michal Simek <michal.simek@xilinx.com> | 2013-03-20 10:24:59 +0100 | 
|---|---|---|
| committer | Michal Simek <michal.simek@xilinx.com> | 2013-04-04 09:09:10 +0200 | 
| commit | c5263bb8b7944f1e34b36b5ea8a9119fc48a31ae (patch) | |
| tree | 650ec881b4d9516263a1ea58dc5f0cceaeb6d9d1 /arch/arm/mach-zynq/timer.c | |
| parent | e932900a3279b5dbb6d8f43c7b369003620e137c (diff) | |
| download | olio-linux-3.10-c5263bb8b7944f1e34b36b5ea8a9119fc48a31ae.tar.xz olio-linux-3.10-c5263bb8b7944f1e34b36b5ea8a9119fc48a31ae.zip  | |
arm: zynq: Move timer to clocksource interface
Use clocksource timer initialization.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Diffstat (limited to 'arch/arm/mach-zynq/timer.c')
| -rw-r--r-- | arch/arm/mach-zynq/timer.c | 43 | 
1 files changed, 20 insertions, 23 deletions
diff --git a/arch/arm/mach-zynq/timer.c b/arch/arm/mach-zynq/timer.c index 82357d94a0e..ab5b839e22f 100644 --- a/arch/arm/mach-zynq/timer.c +++ b/arch/arm/mach-zynq/timer.c @@ -22,7 +22,6 @@  #include <linux/of_irq.h>  #include <linux/slab.h>  #include <linux/clk-provider.h> -#include "common.h"  /*   * This driver configures the 2 16-bit count-up timers as follows: @@ -260,8 +259,10 @@ static void __init xttc_setup_clocksource(struct clk *clk, void __iomem *base)  	ttccs->xttc.clk = clk;  	err = clk_prepare_enable(ttccs->xttc.clk); -	if (WARN_ON(err)) +	if (WARN_ON(err)) { +		kfree(ttccs);  		return; +	}  	ttccs->xttc.clk_rate_change_nb.notifier_call =  		xttcps_rate_change_clocksource_cb; @@ -290,9 +291,10 @@ static void __init xttc_setup_clocksource(struct clk *clk, void __iomem *base)  	err = clocksource_register_hz(&ttccs->cs,  			clk_get_rate(ttccs->xttc.clk) / PRESCALE); -	if (WARN_ON(err)) +	if (WARN_ON(err)) { +		kfree(ttccs);  		return; - +	}  }  static int xttcps_rate_change_clockevent_cb(struct notifier_block *nb, @@ -341,8 +343,10 @@ static void __init xttc_setup_clockevent(struct clk *clk,  	ttcce->xttc.clk = clk;  	err = clk_prepare_enable(ttcce->xttc.clk); -	if (WARN_ON(err)) +	if (WARN_ON(err)) { +		kfree(ttcce);  		return; +	}  	ttcce->xttc.clk_rate_change_nb.notifier_call =  		xttcps_rate_change_clockevent_cb; @@ -373,8 +377,10 @@ static void __init xttc_setup_clockevent(struct clk *clk,  	err = request_irq(irq, xttcps_clock_event_interrupt,  			  IRQF_DISABLED | IRQF_TIMER,  			  ttcce->ce.name, ttcce); -	if (WARN_ON(err)) +	if (WARN_ON(err)) { +		kfree(ttcce);  		return; +	}  	clockevents_config_and_register(&ttcce->ce,  			clk_get_rate(ttcce->xttc.clk) / PRESCALE, 1, 0xfffe); @@ -386,11 +392,17 @@ static void __init xttc_setup_clockevent(struct clk *clk,   * Initializes the timer hardware and register the clock source and clock event   * timers with Linux kernal timer framework   */ -static void __init xttcps_timer_init_of(struct device_node *timer) +static void __init xttcps_timer_init(struct device_node *timer)  {  	unsigned int irq;  	void __iomem *timer_baseaddr;  	struct clk *clk; +	static int initialized; + +	if (initialized) +		return; + +	initialized = 1;  	/*  	 * Get the 1st Triple Timer Counter (TTC) block from the device tree @@ -421,19 +433,4 @@ static void __init xttcps_timer_init_of(struct device_node *timer)  	pr_info("%s #0 at %p, irq=%d\n", timer->name, timer_baseaddr, irq);  } -void __init xttcps_timer_init(void) -{ -	const char * const timer_list[] = { -		"cdns,ttc", -		NULL -	}; -	struct device_node *timer; - -	timer = of_find_compatible_node(NULL, NULL, timer_list[0]); -	if (!timer) { -		pr_err("ERROR: no compatible timer found\n"); -		BUG(); -	} - -	xttcps_timer_init_of(timer); -} +CLOCKSOURCE_OF_DECLARE(ttc, "cdns,ttc", xttcps_timer_init);  |