|
@@ -172,6 +172,32 @@ unsigned long long sched_clock(void)
|
|
|
clocksource_32k.mult, clocksource_32k.shift);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * read_persistent_clock - Return time from a persistent clock.
|
|
|
+ *
|
|
|
+ * Reads the time from a source which isn't disabled during PM, the
|
|
|
+ * 32k sync timer. Convert the cycles elapsed since last read into
|
|
|
+ * nsecs and adds to a monotonically increasing timespec.
|
|
|
+ */
|
|
|
+static struct timespec persistent_ts;
|
|
|
+static cycles_t cycles, last_cycles;
|
|
|
+void read_persistent_clock(struct timespec *ts)
|
|
|
+{
|
|
|
+ unsigned long long nsecs;
|
|
|
+ cycles_t delta;
|
|
|
+ struct timespec *tsp = &persistent_ts;
|
|
|
+
|
|
|
+ last_cycles = cycles;
|
|
|
+ cycles = clocksource_32k.read(&clocksource_32k);
|
|
|
+ delta = cycles - last_cycles;
|
|
|
+
|
|
|
+ nsecs = clocksource_cyc2ns(delta,
|
|
|
+ clocksource_32k.mult, clocksource_32k.shift);
|
|
|
+
|
|
|
+ timespec_add_ns(tsp, nsecs);
|
|
|
+ *ts = *tsp;
|
|
|
+}
|
|
|
+
|
|
|
static int __init omap_init_clocksource_32k(void)
|
|
|
{
|
|
|
static char err[] __initdata = KERN_ERR
|