|
@@ -19,6 +19,7 @@
|
|
|
#include <linux/reboot.h>
|
|
|
#include <linux/acpi.h>
|
|
|
#include <linux/module.h>
|
|
|
+#include <linux/syscore_ops.h>
|
|
|
#include <asm/io.h>
|
|
|
#include <trace/events/power.h>
|
|
|
|
|
@@ -677,6 +678,39 @@ static void acpi_sleep_suspend_setup(void)
|
|
|
static inline void acpi_sleep_suspend_setup(void) {}
|
|
|
#endif /* !CONFIG_SUSPEND */
|
|
|
|
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
|
+static u32 saved_bm_rld;
|
|
|
+
|
|
|
+static int acpi_save_bm_rld(void)
|
|
|
+{
|
|
|
+ acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &saved_bm_rld);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void acpi_restore_bm_rld(void)
|
|
|
+{
|
|
|
+ u32 resumed_bm_rld = 0;
|
|
|
+
|
|
|
+ acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &resumed_bm_rld);
|
|
|
+ if (resumed_bm_rld == saved_bm_rld)
|
|
|
+ return;
|
|
|
+
|
|
|
+ acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_RLD, saved_bm_rld);
|
|
|
+}
|
|
|
+
|
|
|
+static struct syscore_ops acpi_sleep_syscore_ops = {
|
|
|
+ .suspend = acpi_save_bm_rld,
|
|
|
+ .resume = acpi_restore_bm_rld,
|
|
|
+};
|
|
|
+
|
|
|
+void acpi_sleep_syscore_init(void)
|
|
|
+{
|
|
|
+ register_syscore_ops(&acpi_sleep_syscore_ops);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void acpi_sleep_syscore_init(void) {}
|
|
|
+#endif /* CONFIG_PM_SLEEP */
|
|
|
+
|
|
|
#ifdef CONFIG_HIBERNATION
|
|
|
static unsigned long s4_hardware_signature;
|
|
|
static struct acpi_table_facs *facs;
|
|
@@ -839,6 +873,7 @@ int __init acpi_sleep_init(void)
|
|
|
|
|
|
sleep_states[ACPI_STATE_S0] = 1;
|
|
|
|
|
|
+ acpi_sleep_syscore_init();
|
|
|
acpi_sleep_suspend_setup();
|
|
|
acpi_sleep_hibernate_setup();
|
|
|
|