* Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> [091117 15:41]: > During suspend, the kernel timekeeping subsystem is shut down. Before > suspend and upon resume, it uses a weak function > read_persistent_clock() to determine the amount of time that elapsed > during suspend. > > This function was not implemented on OMAP, so from the timekeeping > subsystem perspective (and thus userspace as well) it appeared that no > time elapsed during suspend. > > This patch uses the 32k sync timer as a the persistent clock the 32k > sync timer value converted to seconds. > > NOTE: This does *NOT* handle wrapping of the 32k sync timer, so > wrapping of the 32k sync timer during suspend may cause > problems. Also, there are not interrupts when the 32k sync > timer wraps, so something else has to be done. Kevin, are you planning to queue this in your PM series for the next merge window? In that case Acked-by: Tony Lindgren <tony@xxxxxxxxxxx> If you want me to queue this as a fix for the -rc series, let me know. Regards, Tony > Reported-by: Jon Hunter <jon-hunter@xxxxxx> > Signed-off-by: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx> > --- > Since v1 of this patch, the signature of this function changed. > > Also note that forthcoming omap_device patches will depend on this > function instead of getnstimeofday() since the timekeeping subsystem > is suspended when we want to do omap_device timing measurements. > > arch/arm/plat-omap/common.c | 19 +++++++++++++++++++ > 1 files changed, 19 insertions(+), 0 deletions(-) > > diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c > index cc050b3..8057966 100644 > --- a/arch/arm/plat-omap/common.c > +++ b/arch/arm/plat-omap/common.c > @@ -172,6 +172,25 @@ unsigned long long sched_clock(void) > clocksource_32k.mult, clocksource_32k.shift); > } > > +/** > + * read_persistent_clock - Return time from the persistent clock. > + * > + * Reads the time from a source which isn't disabled during PM: 32k sync > + * Returns a timespec with tv_sec=0 and tv_nsec=0 if unsupported. > + * > + */ > +void read_persistent_clock(struct timespec *ts) > +{ > + unsigned long long nsecs; > + cycle_t cycles; > + > + ts->tv_sec = ts->tv_nsec = 0; > + cycles = clocksource_32k.read(&clocksource_32k); > + nsecs = clocksource_cyc2ns(cycles, > + clocksource_32k.mult, clocksource_32k.shift); > + timespec_add_ns(ts, nsecs); > +} > + > static int __init omap_init_clocksource_32k(void) > { > static char err[] __initdata = KERN_ERR > -- > 1.6.5.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html