|
|
@@ -351,6 +351,20 @@ int device_set_wakeup_enable(struct device *dev, bool enable)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(device_set_wakeup_enable);
|
|
|
|
|
|
+/**
|
|
|
+ * wakeup_source_not_registered - validate the given wakeup source.
|
|
|
+ * @ws: Wakeup source to be validated.
|
|
|
+ */
|
|
|
+static bool wakeup_source_not_registered(struct wakeup_source *ws)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Use timer struct to check if the given source is initialized
|
|
|
+ * by wakeup_source_add.
|
|
|
+ */
|
|
|
+ return ws->timer.function != pm_wakeup_timer_fn ||
|
|
|
+ ws->timer.data != (unsigned long)ws;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* The functions below use the observation that each wakeup event starts a
|
|
|
* period in which the system should not be suspended. The moment this period
|
|
|
@@ -391,6 +405,10 @@ static void wakeup_source_activate(struct wakeup_source *ws)
|
|
|
{
|
|
|
unsigned int cec;
|
|
|
|
|
|
+ if (WARN_ONCE(wakeup_source_not_registered(ws),
|
|
|
+ "unregistered wakeup source\n"))
|
|
|
+ return;
|
|
|
+
|
|
|
/*
|
|
|
* active wakeup source should bring the system
|
|
|
* out of PM_SUSPEND_FREEZE state
|