|
@@ -21,6 +21,7 @@
|
|
#include <linux/of_address.h>
|
|
#include <linux/of_address.h>
|
|
#include <linux/clk/ti.h>
|
|
#include <linux/clk/ti.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/delay.h>
|
|
|
|
+#include <linux/timekeeping.h>
|
|
#include "clock.h"
|
|
#include "clock.h"
|
|
|
|
|
|
#define NO_IDLEST 0x1
|
|
#define NO_IDLEST 0x1
|
|
@@ -90,7 +91,18 @@ static bool _omap4_is_ready(u32 val)
|
|
|
|
|
|
static bool _omap4_is_timeout(union omap4_timeout *time, u32 timeout)
|
|
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) {
|
|
if (time->cycles++ < timeout) {
|
|
udelay(1);
|
|
udelay(1);
|
|
return false;
|
|
return false;
|