#include <linux/suspend.h>
#include <linux/syscore_ops.h>
#include <linux/ftrace.h>
+#include <linux/rtc.h>
#include <trace/events/power.h>
#include "power.h"
struct pm_sleep_state pm_states[PM_SUSPEND_MAX] = {
+#ifdef CONFIG_EARLYSUSPEND
+ [PM_SUSPEND_ON] = { .label = "on", },
+#endif
[PM_SUSPEND_FREEZE] = { .label = "freeze", .state = PM_SUSPEND_FREEZE },
[PM_SUSPEND_STANDBY] = { .label = "standby", },
[PM_SUSPEND_MEM] = { .label = "mem", },
if (need_suspend_ops(state) && !suspend_ops)
return -ENOSYS;
+#ifdef CONFIG_TOI
+ drop_pagecache();
+#endif
+
trace_machine_suspend(state);
if (need_suspend_ops(state) && suspend_ops->begin) {
error = suspend_ops->begin(state);
suspend_ops->recover();
goto Resume_devices;
}
+EXPORT_SYMBOL_GPL(suspend_devices_and_enter);
/**
* suspend_finish - Clean up before finishing the suspend sequence.
* Fail if that's not the case. Otherwise, prepare for system suspend, make the
* system enter the given sleep state and clean up after wakeup.
*/
-static int enter_state(suspend_state_t state)
+//<20130327> <marc.huang> merge from android kernel 3.0 - modify enter_state function to non-static
+int enter_state(suspend_state_t state)
{
int error;
freeze_begin();
printk(KERN_INFO "PM: Syncing filesystems ... ");
+ #if 1
sys_sync();
+ #else /* sys_sync WQ ver2.0 use */
+ //[MTK]
+ suspend_syssync_enqueue();
+ suspend_check_sys_sync_done();
+ #endif
printk("done.\n");
pr_debug("PM: Preparing system for %s sleep\n", pm_states[state].label);
return error;
}
+static void pm_suspend_marker(char *annotation)
+{
+ struct timespec ts;
+ struct rtc_time tm;
+
+ getnstimeofday(&ts);
+ rtc_time_to_tm(ts.tv_sec, &tm);
+ pr_info("PM: suspend %s %d-%02d-%02d %02d:%02d:%02d.%09lu UTC\n",
+ annotation, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
+ tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);
+}
+
/**
* pm_suspend - Externally visible function for suspending the system.
* @state: System sleep state to enter.
if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX)
return -EINVAL;
+ pm_suspend_marker("entry");
error = enter_state(state);
if (error) {
suspend_stats.fail++;
} else {
suspend_stats.success++;
}
+ pm_suspend_marker("exit");
return error;
}
EXPORT_SYMBOL(pm_suspend);