summaryrefslogtreecommitdiff
path: root/drivers/clocksource/dw_apb_timer_of.c
diff options
context:
space:
mode:
authorJohn Stultz <john.stultz@linaro.org>2013-06-18 06:34:57 +0400
committerJohn Stultz <john.stultz@linaro.org>2013-06-19 03:02:04 +0400
commitd3d8fee4138a06b4b9ca172d25b8412fc33ad3f3 (patch)
treedc804dda28981d7a1095785658846fa5428af530 /drivers/clocksource/dw_apb_timer_of.c
parent336ae1180df5f69b9e0fb6561bec01c5f64361cf (diff)
downloadlinux-d3d8fee4138a06b4b9ca172d25b8412fc33ad3f3.tar.xz
Revert "dw_apb_timer_of.c: Remove parts that were picoxcell-specific"
This reverts commit 55a68c23e0a675b2b8ac2656fd6edbf98b78e4c6. In order to avoid a collision with dw_apb_timer changes in the arm-soc tree, revert this change. I'm leaving it to the arm-soc folks to sort out if they want to keep the other side of the collision or if they're just going to back it all out and try again during the next release cycle. Reported-by: Dinh Nguyen <dinguyen@altera.com> Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'drivers/clocksource/dw_apb_timer_of.c')
-rw-r--r--drivers/clocksource/dw_apb_timer_of.c52
1 files changed, 29 insertions, 23 deletions
diff --git a/drivers/clocksource/dw_apb_timer_of.c b/drivers/clocksource/dw_apb_timer_of.c
index a97b4065dacf..d9a1e8d51751 100644
--- a/drivers/clocksource/dw_apb_timer_of.c
+++ b/drivers/clocksource/dw_apb_timer_of.c
@@ -55,15 +55,6 @@ static void add_clockevent(struct device_node *event_timer)
dw_apb_clockevent_register(ced);
}
-static void __iomem *sched_io_base;
-
-/* This is actually same as __apbt_read_clocksource(), but with
- different interface */
-static u32 read_sched_clock_sptimer(void)
-{
- return ~__raw_readl(sched_io_base + APBTMR_N_CURRENT_VALUE);
-}
-
static void add_clocksource(struct device_node *source_timer)
{
void __iomem *iobase;
@@ -78,27 +69,41 @@ static void add_clocksource(struct device_node *source_timer)
dw_apb_clocksource_start(cs);
dw_apb_clocksource_register(cs);
+}
- sched_io_base = iobase;
- setup_sched_clock(read_sched_clock_sptimer, 32, rate);
+static void __iomem *sched_io_base;
+
+static u32 read_sched_clock(void)
+{
+ return __raw_readl(sched_io_base);
}
-static const struct of_device_id osctimer_ids[] __initconst = {
- { .compatible = "picochip,pc3x2-timer" },
- { .compatible = "snps,dw-apb-timer-osc" },
+static const struct of_device_id sptimer_ids[] __initconst = {
+ { .compatible = "picochip,pc3x2-rtc" },
{ .compatible = "snps,dw-apb-timer-sp" },
- { /* Sentinel */ },
+ { /* Sentinel */ },
};
-/*
- You don't have to use dw_apb_timer for scheduler clock,
- this should also work fine on arm:
+static void init_sched_clock(void)
+{
+ struct device_node *sched_timer;
+ u32 rate;
- twd_local_timer_of_register();
- arch_timer_of_register();
- arch_timer_sched_clock_init();
-*/
+ sched_timer = of_find_matching_node(NULL, sptimer_ids);
+ if (!sched_timer)
+ panic("No RTC for sched clock to use");
+ timer_get_base_and_rate(sched_timer, &sched_io_base, &rate);
+ of_node_put(sched_timer);
+
+ setup_sched_clock(read_sched_clock, 32, rate);
+}
+
+static const struct of_device_id osctimer_ids[] __initconst = {
+ { .compatible = "picochip,pc3x2-timer" },
+ { .compatible = "snps,dw-apb-timer-osc" },
+ {},
+};
void __init dw_apb_timer_init(void)
{
@@ -114,6 +119,7 @@ void __init dw_apb_timer_init(void)
panic("No timer for clocksource");
add_clocksource(source_timer);
- of_node_put(event_timer);
of_node_put(source_timer);
+
+ init_sched_clock();
}