]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/base/power/wakeup.c
Revert "ACPI / sleep: Ignore spurious SCI wakeups from suspend-to-idle"
[karo-tx-linux.git] / drivers / base / power / wakeup.c
index 1368549704893c0c93e50ccf2ccaaecda51c2b1e..c313b600d356260fd9b98fe4848340f9cbdcf9ae 100644 (file)
@@ -525,12 +525,6 @@ static void wakeup_source_activate(struct wakeup_source *ws)
                        "unregistered wakeup source\n"))
                return;
 
-       /*
-        * active wakeup source should bring the system
-        * out of PM_SUSPEND_FREEZE state
-        */
-       freeze_wake();
-
        ws->active = true;
        ws->active_count++;
        ws->last_time = ktime_get();
@@ -546,8 +540,9 @@ static void wakeup_source_activate(struct wakeup_source *ws)
 /**
  * wakeup_source_report_event - Report wakeup event using the given source.
  * @ws: Wakeup source to report the event for.
+ * @hard: If set, abort suspends in progress and wake up from suspend-to-idle.
  */
-static void wakeup_source_report_event(struct wakeup_source *ws)
+static void wakeup_source_report_event(struct wakeup_source *ws, bool hard)
 {
        ws->event_count++;
        /* This is racy, but the counter is approximate anyway. */
@@ -556,6 +551,9 @@ static void wakeup_source_report_event(struct wakeup_source *ws)
 
        if (!ws->active)
                wakeup_source_activate(ws);
+
+       if (hard)
+               pm_system_wakeup();
 }
 
 /**
@@ -573,7 +571,7 @@ void __pm_stay_awake(struct wakeup_source *ws)
 
        spin_lock_irqsave(&ws->lock, flags);
 
-       wakeup_source_report_event(ws);
+       wakeup_source_report_event(ws, false);
        del_timer(&ws->timer);
        ws->timer_expires = 0;
 
@@ -739,9 +737,10 @@ static void pm_wakeup_timer_fn(unsigned long data)
 }
 
 /**
- * __pm_wakeup_event - Notify the PM core of a wakeup event.
+ * pm_wakeup_ws_event - Notify the PM core of a wakeup event.
  * @ws: Wakeup source object associated with the event source.
  * @msec: Anticipated event processing time (in milliseconds).
+ * @hard: If set, abort suspends in progress and wake up from suspend-to-idle.
  *
  * Notify the PM core of a wakeup event whose source is @ws that will take
  * approximately @msec milliseconds to be processed by the kernel.  If @ws is
@@ -750,7 +749,7 @@ static void pm_wakeup_timer_fn(unsigned long data)
  *
  * It is safe to call this function from interrupt context.
  */
-void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec)
+void pm_wakeup_ws_event(struct wakeup_source *ws, unsigned int msec, bool hard)
 {
        unsigned long flags;
        unsigned long expires;
@@ -760,7 +759,7 @@ void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec)
 
        spin_lock_irqsave(&ws->lock, flags);
 
-       wakeup_source_report_event(ws);
+       wakeup_source_report_event(ws, hard);
 
        if (!msec) {
                wakeup_source_deactivate(ws);
@@ -779,17 +778,17 @@ void __pm_wakeup_event(struct wakeup_source *ws, unsigned int msec)
  unlock:
        spin_unlock_irqrestore(&ws->lock, flags);
 }
-EXPORT_SYMBOL_GPL(__pm_wakeup_event);
-
+EXPORT_SYMBOL_GPL(pm_wakeup_ws_event);
 
 /**
  * pm_wakeup_event - Notify the PM core of a wakeup event.
  * @dev: Device the wakeup event is related to.
  * @msec: Anticipated event processing time (in milliseconds).
+ * @hard: If set, abort suspends in progress and wake up from suspend-to-idle.
  *
- * Call __pm_wakeup_event() for the @dev's wakeup source object.
+ * Call pm_wakeup_ws_event() for the @dev's wakeup source object.
  */
-void pm_wakeup_event(struct device *dev, unsigned int msec)
+void pm_wakeup_dev_event(struct device *dev, unsigned int msec, bool hard)
 {
        unsigned long flags;
 
@@ -797,10 +796,10 @@ void pm_wakeup_event(struct device *dev, unsigned int msec)
                return;
 
        spin_lock_irqsave(&dev->power.lock, flags);
-       __pm_wakeup_event(dev->power.wakeup, msec);
+       pm_wakeup_ws_event(dev->power.wakeup, msec, hard);
        spin_unlock_irqrestore(&dev->power.lock, flags);
 }
-EXPORT_SYMBOL_GPL(pm_wakeup_event);
+EXPORT_SYMBOL_GPL(pm_wakeup_dev_event);
 
 void pm_print_active_wakeup_sources(void)
 {