/* Hook to Linux PM */ void mtkpasr_phaseone_ops(void) { IS_MTKPASR_ENABLED_NORV; /* It means no need to apply this op (Simply for paging or other periodic wakeups) */ if (is_mtkpasr_triggered()) { return; } MTKPASR_START_PROFILE(); #ifdef CONFIG_MTKPASR_MAFL if (mtkpasr_no_phaseone_ops()) goto no_phaseone; #endif mtkpasr_info("\n"); /* Drop cache - linux/mm.h */ drop_pagecache(); #ifdef CONFIG_MTKPASR_MAFL no_phaseone: #endif MTKPASR_END_PROFILE(); }
/** * suspend_devices_and_enter - Suspend devices and enter system sleep state. * @state: System sleep state to enter. */ int suspend_devices_and_enter(suspend_state_t state) { int error; bool wakeup = false; 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); if (error) goto Close; } suspend_console(); ftrace_stop(); suspend_test_start(); error = dpm_suspend_start(PMSG_SUSPEND); if (error) { printk(KERN_ERR "PM: Some devices failed to suspend\n"); goto Recover_platform; } suspend_test_finish("suspend devices"); if (suspend_test(TEST_DEVICES)) goto Recover_platform; do { error = suspend_enter(state, &wakeup); } while (!error && !wakeup && need_suspend_ops(state) && suspend_ops->suspend_again && suspend_ops->suspend_again()); Resume_devices: suspend_test_start(); dpm_resume_end(PMSG_RESUME); suspend_test_finish("resume devices"); ftrace_start(); resume_console(); Close: if (need_suspend_ops(state) && suspend_ops->end) suspend_ops->end(); trace_machine_suspend(PWR_EVENT_EXIT); return error; Recover_platform: if (need_suspend_ops(state) && suspend_ops->recover) suspend_ops->recover(); goto Resume_devices; }
/* Hook to Linux PM */ void mtkpasr_phaseone_ops(void) { MTKPASR_START_PROFILE(); #ifdef CONFIG_MTKPASR_MAFL if (mtkpasr_no_phaseone_ops()) goto no_phaseone; #endif mtkpasr_info("\n"); /* Drop cache - linux/mm.h */ drop_pagecache(); #ifdef CONFIG_MTKPASR_MAFL no_phaseone: #endif MTKPASR_END_PROFILE(); }
/* Hook to Linux PM */ void mtkpasr_phaseone_ops(void) { struct wd_api *wd_api = NULL; /* To restart wdt */ if (get_wd_api(&wd_api) == 0) { mtkpasr_log("PASR kicks WDT!\n"); wd_api->wd_restart(WD_TYPE_NORMAL); } IS_MTKPASR_ENABLED_NORV; /* It means no need to apply this op (Simply for paging or other periodic wakeups) */ if (is_mtkpasr_triggered()) { return; } MTKPASR_START_PROFILE(); /* It will go to MTKPASR stage */ current->flags |= PF_MTKPASR; /* Inform all other memory pools to release their memory */ try_to_shrink_slab(); /* It will leave MTKPASR stage */ current->flags &= ~PF_MTKPASR; #ifdef CONFIG_MTKPASR_MAFL if (mtkpasr_no_phaseone_ops()) goto no_phaseone; #endif mtkpasr_info("\n"); /* Drop cache - linux/mm.h */ drop_pagecache(); #ifdef CONFIG_MTKPASR_MAFL no_phaseone: #endif MTKPASR_END_PROFILE(); }