|
@@ -25,6 +25,9 @@
|
|
|
*/
|
|
|
bool events_check_enabled __read_mostly;
|
|
|
|
|
|
+/* First wakeup IRQ seen by the kernel in the last cycle. */
|
|
|
+unsigned int pm_wakeup_irq __read_mostly;
|
|
|
+
|
|
|
/* If set and the system is suspending, terminate the suspend. */
|
|
|
static bool pm_abort_suspend __read_mostly;
|
|
|
|
|
@@ -91,7 +94,7 @@ struct wakeup_source *wakeup_source_create(const char *name)
|
|
|
if (!ws)
|
|
|
return NULL;
|
|
|
|
|
|
- wakeup_source_prepare(ws, name ? kstrdup(name, GFP_KERNEL) : NULL);
|
|
|
+ wakeup_source_prepare(ws, name ? kstrdup_const(name, GFP_KERNEL) : NULL);
|
|
|
return ws;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(wakeup_source_create);
|
|
@@ -154,7 +157,7 @@ void wakeup_source_destroy(struct wakeup_source *ws)
|
|
|
|
|
|
wakeup_source_drop(ws);
|
|
|
wakeup_source_record(ws);
|
|
|
- kfree(ws->name);
|
|
|
+ kfree_const(ws->name);
|
|
|
kfree(ws);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(wakeup_source_destroy);
|
|
@@ -868,6 +871,15 @@ EXPORT_SYMBOL_GPL(pm_system_wakeup);
|
|
|
void pm_wakeup_clear(void)
|
|
|
{
|
|
|
pm_abort_suspend = false;
|
|
|
+ pm_wakeup_irq = 0;
|
|
|
+}
|
|
|
+
|
|
|
+void pm_system_irq_wakeup(unsigned int irq_number)
|
|
|
+{
|
|
|
+ if (pm_wakeup_irq == 0) {
|
|
|
+ pm_wakeup_irq = irq_number;
|
|
|
+ pm_system_wakeup();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|