aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2013-06-04 05:38:42 -0400
committerHeiko Stuebner <heiko@sntech.de>2013-06-12 07:47:38 -0400
commit10021488997317d1121505a7ac659124c058efed (patch)
treef60e46a76bfb07bdce714f959fca5abaec26ff94 /drivers/clocksource
parent1b4eca0f634be2a99f2baa6c29dfd183590ead3f (diff)
clocksource: dw_apb_timer_of: use clocksource_of_init
dw_apb_timer_init used to search the devicetree for matching timer devices, making calls to it from board files necessary. Change the dw_apb_timer_init to work with CLOCKSOURCE_OF_DECLARE. With this change the function gets called once for each timer node and tracks these number of calls to attach clockevent and clocksource devices to the nodes. Also remove the calls to dw_apb_timer_init from all previous users, as clocksource_of_init is the default for init_time now. Tested on the upcoming rk3066 code. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Acked-by: Rob Herring <rob.herring@calxeda.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Jamie Iles <jamie@jamieiles.com> Acked-by: Dinh Nguyen <dinguyen@altera.com>
Diffstat (limited to 'drivers/clocksource')
-rw-r--r--drivers/clocksource/Kconfig1
-rw-r--r--drivers/clocksource/dw_apb_timer_of.c41
2 files changed, 21 insertions, 21 deletions
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 48a0f2e1dd78..5871933c4e51 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -22,6 +22,7 @@ config DW_APB_TIMER
22config DW_APB_TIMER_OF 22config DW_APB_TIMER_OF
23 bool 23 bool
24 select DW_APB_TIMER 24 select DW_APB_TIMER
25 select CLKSRC_OF
25 26
26config ARMADA_370_XP_TIMER 27config ARMADA_370_XP_TIMER
27 bool 28 bool
diff --git a/drivers/clocksource/dw_apb_timer_of.c b/drivers/clocksource/dw_apb_timer_of.c
index 1964f8716966..cef554432a33 100644
--- a/drivers/clocksource/dw_apb_timer_of.c
+++ b/drivers/clocksource/dw_apb_timer_of.c
@@ -133,27 +133,26 @@ static void init_sched_clock(void)
133 setup_sched_clock(read_sched_clock, 32, sched_rate); 133 setup_sched_clock(read_sched_clock, 32, sched_rate);
134} 134}
135 135
136static const struct of_device_id osctimer_ids[] __initconst = { 136static int num_called;
137 { .compatible = "picochip,pc3x2-timer" }, 137static void __init dw_apb_timer_init(struct device_node *timer)
138 { .compatible = "snps,dw-apb-timer-osc" },
139 {},
140};
141
142void __init dw_apb_timer_init(void)
143{ 138{
144 struct device_node *event_timer, *source_timer; 139 switch (num_called) {
145 140 case 0:
146 event_timer = of_find_matching_node(NULL, osctimer_ids); 141 pr_debug("%s: found clockevent timer\n", __func__);
147 if (!event_timer) 142 add_clockevent(timer);
148 panic("No timer for clockevent"); 143 of_node_put(timer);
149 add_clockevent(event_timer); 144 break;
150 145 case 1:
151 source_timer = of_find_matching_node(event_timer, osctimer_ids); 146 pr_debug("%s: found clocksource timer\n", __func__);
152 if (!source_timer) 147 add_clocksource(timer);
153 panic("No timer for clocksource"); 148 of_node_put(timer);
154 add_clocksource(source_timer); 149 init_sched_clock();
155 150 break;
156 of_node_put(source_timer); 151 default:
152 break;
153 }
157 154
158 init_sched_clock(); 155 num_called++;
159} 156}
157CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init);
158CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer-osc", dw_apb_timer_init);