clocksource/drivers/atcpit100: VDSO support
authorRick Chen <rickchen36@gmail.com>
Tue, 12 Dec 2017 05:12:21 +0000 (13:12 +0800)
committerGreentime Hu <greentime@andestech.com>
Thu, 22 Feb 2018 02:44:36 +0000 (10:44 +0800)
VDSO needs real-time cycle count to ensure the time accuracy.
Unlike others, nds32 architecture does not define clock source,
hence VDSO needs atcpit100 offering real-time cycle count
to derive the correct time.

Signed-off-by: Vincent Chen <vincentc@andestech.com>
Signed-off-by: Rick Chen <rickchen36@gmail.com>
Signed-off-by: Greentime Hu <green.hu@gmail.com>
drivers/clocksource/timer-atcpit100.c

index 2190096cffa34b27f1d02100273e08227f8ea8cd..5e23d7b4a72200f7117283cce4cb47f003022e27 100644 (file)
@@ -18,6 +18,9 @@
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include "timer-of.h"
+#ifdef CONFIG_NDS32
+#include <asm/vdso_timer_info.h>
+#endif
 
 /*
  * Definition of register offsets
@@ -204,6 +207,17 @@ static u64 notrace atcpit100_timer_sched_read(void)
        return ~readl(timer_of_base(&to) + CH1_CNT);
 }
 
+#ifdef CONFIG_NDS32
+static void fill_vdso_need_info(struct device_node *node)
+{
+       struct resource timer_res;
+       of_address_to_resource(node, 0, &timer_res);
+       timer_info.mapping_base = (unsigned long)timer_res.start;
+       timer_info.cycle_count_down = true;
+       timer_info.cycle_count_reg_offset = CH1_CNT;
+}
+#endif
+
 static int __init atcpit100_timer_init(struct device_node *node)
 {
        int ret;
@@ -242,6 +256,10 @@ static int __init atcpit100_timer_init(struct device_node *node)
        val = readl(base + INT_EN);
        writel(val | CH0INT0EN, base + INT_EN);
 
+#ifdef CONFIG_NDS32
+       fill_vdso_need_info(node);
+#endif
+
        return ret;
 }