Tony Lindgren <tony@xxxxxxxxxxx> writes: > * 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. I'll queue it for next merge window, thanks. Kevin > >> 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