greybus: loopback: handle timestamp roll-over

This patch ensures we account for roll-over in the loopback driver.
do_gettimeofday() is used to grab a timestamp. Two timestamps are derived
one before and one after a gb_operation_sync(), however since
do_gettimeofday() returns the number of seconds and mircoseconds that have
elapsed today - we need to account for a situation where the timestamp
starts at say 23:59:999us rolls over and the end time is now earlier than
the start time.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c
index ac38644..852b6be 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -22,6 +22,8 @@
 
 #include "greybus.h"
 
+#define NSEC_PER_DAY 86400000000000ULL
+
 struct gb_loopback_stats {
 	u32 min;
 	u32 max;
@@ -226,7 +228,10 @@
 
 	t1 = timeval_to_ns(ts);
 	t2 = timeval_to_ns(te);
-	gb->elapsed_nsecs = t2 - t1;
+	if (t2 > t1)
+		gb->elapsed_nsecs = t2 - t1;
+	else
+		gb->elapsed_nsecs = NSEC_PER_DAY - t2 + t1;
 }
 
 static int gb_loopback_sink(struct gb_loopback *gb, u32 len)