#include <linux/of_address.h>
 #include <linux/clk/ti.h>
 #include <linux/delay.h>
+#include <linux/timekeeping.h>
 #include "clock.h"
 
 #define NO_IDLEST                      0x1
 
 static bool _omap4_is_timeout(union omap4_timeout *time, u32 timeout)
 {
-       if (unlikely(_early_timeout)) {
+       /*
+        * There are two special cases where ktime_to_ns() can't be
+        * used to track the timeouts. First one is during early boot
+        * when the timers haven't been initialized yet. The second
+        * one is during suspend-resume cycle while timekeeping is
+        * being suspended / resumed. Clocksource for the system
+        * can be from a timer that requires pm_runtime access, which
+        * will eventually bring us here with timekeeping_suspended,
+        * during both suspend entry and resume paths. This happens
+        * at least on am43xx platform.
+        */
+       if (unlikely(_early_timeout || timekeeping_suspended)) {
                if (time->cycles++ < timeout) {
                        udelay(1);
                        return false;