static void try_to_suspend(struct work_struct *work) { unsigned int initial_count, final_count; if (!pm_get_wakeup_count(&initial_count, true)) { #ifdef CONFIG_HTC_POWER_DEBUG pr_info("[P] suspend abort, wakeup event nonzero\n"); htc_print_active_wakeup_sources(); #endif goto out; } mutex_lock(&autosleep_lock); if (!pm_save_wakeup_count(initial_count)) { #ifdef CONFIG_HTC_POWER_DEBUG pr_info("[P] suspend abort, events not matched or being processed\n"); #endif mutex_unlock(&autosleep_lock); goto out; } if (autosleep_state == PM_SUSPEND_ON) { #ifdef CONFIG_HTC_POWER_DEBUG pr_info("[P] suspend abort, autosleep_state is ON\n"); #endif mutex_unlock(&autosleep_lock); return; } if (autosleep_state >= PM_SUSPEND_MAX) hibernate(); else { #ifdef CONFIG_HTC_POWER_DEBUG pr_info("[R] suspend start\n"); #endif pm_suspend(autosleep_state); } mutex_unlock(&autosleep_lock); if (!pm_get_wakeup_count(&final_count, false)) { #ifdef CONFIG_HTC_POWER_DEBUG pr_info("[R] resume end\n"); #endif goto out; } if (final_count == initial_count) { #ifdef CONFIG_HTC_POWER_DEBUG pr_info("[P] wakeup occured for an unknown reason, wait HZ/2\n"); #endif schedule_timeout_uninterruptible(HZ / 2); } #ifdef CONFIG_HTC_POWER_DEBUG pr_info("[R] resume end\n"); #endif out: queue_up_suspend_work(); }
int __ref pm_autosleep_set_state(suspend_state_t state) { #ifndef CONFIG_HIBERNATION if (state >= PM_SUSPEND_MAX) return -EINVAL; #endif __pm_stay_awake(autosleep_ws); mutex_lock(&autosleep_lock); autosleep_state = state; __pm_relax(autosleep_ws); if (state > PM_SUSPEND_ON) { pm_wakep_autosleep_enabled(true); queue_up_suspend_work(); } else { pm_wakep_autosleep_enabled(false); } if (IS_ENABLED(CONFIG_PM_EARLYSUSPEND)) pm_request_early_suspend_state(state); mutex_unlock(&autosleep_lock); return 0; }
int pm_autosleep_set_state(suspend_state_t state) { #ifndef CONFIG_HIBERNATION if (state >= PM_SUSPEND_MAX) return -EINVAL; #endif __pm_stay_awake(autosleep_ws); mutex_lock(&autosleep_lock); autosleep_state = state; __pm_relax(autosleep_ws); if (state > PM_SUSPEND_ON) { pm_wakep_autosleep_enabled(true); queue_up_suspend_work(); #ifdef CONFIG_POWERSUSPEND // Yank555.lu : add hook to handle powersuspend tasks (sleep) set_power_suspend_state_autosleep_hook(POWER_SUSPEND_ACTIVE); #endif } else { pm_wakep_autosleep_enabled(false); #ifdef CONFIG_POWERSUSPEND // Yank555.lu : add hook to handle powersuspend tasks (wakeup) set_power_suspend_state_autosleep_hook(POWER_SUSPEND_INACTIVE); #endif } mutex_unlock(&autosleep_lock); return 0; }
int pm_autosleep_set_state(suspend_state_t state) { #ifndef CONFIG_HIBERNATION if (state >= PM_SUSPEND_MAX) return -EINVAL; #endif __pm_stay_awake(autosleep_ws); mutex_lock(&autosleep_lock); autosleep_state = state; __pm_relax(autosleep_ws); if (state > PM_SUSPEND_ON) { pm_wakep_autosleep_enabled(true); queue_up_suspend_work(); #ifndef CONFIG_PM_SYNC_BEFORE_SUSPEND printk(KERN_INFO "PM: Syncing filesystems ... "); sys_sync(); printk("done.\n"); #endif } else { pm_wakep_autosleep_enabled(false); } mutex_unlock(&autosleep_lock); return 0; }
int pm_autosleep_set_state(suspend_state_t state) { #ifndef CONFIG_HIBERNATION if (state >= PM_SUSPEND_MAX) return -EINVAL; #endif __pm_stay_awake(autosleep_ws); mutex_lock(&autosleep_lock); autosleep_state = state; __pm_relax(autosleep_ws); if (state > PM_SUSPEND_ON) { pm_wakep_autosleep_enabled(true); zw_queue_up_suspend_work(state); queue_up_suspend_work(); } else { pm_wakep_autosleep_enabled(false); } mutex_unlock(&autosleep_lock); return 0; }
static void try_to_suspend(struct work_struct *work) { unsigned int initial_count, final_count; int error = 0; if (!pm_get_wakeup_count(&initial_count, true)) goto out; mutex_lock(&autosleep_lock); if (!pm_save_wakeup_count(initial_count) || system_state != SYSTEM_RUNNING) { mutex_unlock(&autosleep_lock); goto out; } if (autosleep_state == PM_SUSPEND_ON) { mutex_unlock(&autosleep_lock); return; } if (autosleep_state >= PM_SUSPEND_MAX) hibernate(); else error = pm_suspend(autosleep_state); mutex_unlock(&autosleep_lock); #ifdef CONFIG_SEC_PM if (error) goto out; #endif if (!pm_get_wakeup_count(&final_count, false)) goto out; /* * If the wakeup occured for an unknown reason, wait to prevent the * system from trying to suspend and waking up in a tight loop. */ if (final_count == initial_count) schedule_timeout_uninterruptible(HZ / 2); out: #ifdef CONFIG_SEC_PM if (error) { pr_info("PM: suspend returned(%d)\n", error); schedule_timeout_uninterruptible(HZ / 2); } #endif queue_up_suspend_work(); }
int pm_autosleep_set_state(suspend_state_t state) { #ifdef CONFIG_SEC_GPIO_DVS static bool gpio_init_done = false; #endif #ifndef CONFIG_HIBERNATION if (state >= PM_SUSPEND_MAX) return -EINVAL; #endif #ifdef CONFIG_SEC_GPIO_DVS /************************ Caution !!! ****************************/ /* This function must be located in appropriate INIT position * in accordance with the specification of each BB vendor. */ /************************ Caution !!! ****************************/ if (unlikely(!gpio_init_done) && state==PM_SUSPEND_ON) { gpio_dvs_check_initgpio(); gpio_init_done = true; } #endif __pm_stay_awake(autosleep_ws); mutex_lock(&autosleep_lock); autosleep_state = state; __pm_relax(autosleep_ws); #ifdef CONFIG_SEC_PM_DEBUG wakeup_sources_stats_active(); #endif if (state > PM_SUSPEND_ON) { pm_wakep_autosleep_enabled(true); #ifdef CONFIG_ADAPTIVE_KSM AKSM_suspend(); #endif queue_up_suspend_work(); } else { #ifdef CONFIG_ADAPTIVE_KSM AKSM_resume(); #endif pm_wakep_autosleep_enabled(false); } mutex_unlock(&autosleep_lock); return 0; }
static void try_to_suspend(struct work_struct *work) { unsigned int initial_count, final_count; if (!pm_get_wakeup_count(&initial_count, true)) goto out; mutex_lock(&autosleep_lock); if (!pm_save_wakeup_count(initial_count)) { mutex_unlock(&autosleep_lock); goto out; } if (autosleep_state == PM_SUSPEND_ON) { mutex_unlock(&autosleep_lock); return; } if (autosleep_state >= PM_SUSPEND_MAX) hibernate(); else pm_suspend(autosleep_state); mutex_unlock(&autosleep_lock); if (!pm_get_wakeup_count(&final_count, false)) goto out; /* * If the wakeup occured for an unknown reason, wait to prevent the * system from trying to suspend and waking up in a tight loop. */ if (final_count == initial_count) schedule_timeout_uninterruptible(HZ / 2); out: queue_up_suspend_work(); }
int pm_autosleep_set_state(suspend_state_t state) { #ifndef CONFIG_HIBERNATION if (state >= PM_SUSPEND_MAX) return -EINVAL; #endif __pm_stay_awake(autosleep_ws); mutex_lock(&autosleep_lock); autosleep_state = state; __pm_relax(autosleep_ws); if (state > PM_SUSPEND_ON) { pm_wakep_autosleep_enabled(true); //[+++]Debug for active wakelock before entering suspend g_resume_status = false; //Add a timer to trigger wakelock debug pr_info("[PM]unattended_timer: mod_timer (auto_sleep)\n"); mod_timer(&unattended_timer, jiffies + msecs_to_jiffies(PM_UNATTENDED_TIMEOUT)); //[---]Debug for active wakelock before entering suspend queue_up_suspend_work(); } else { pm_wakep_autosleep_enabled(false); //[+++]Debug for active wakelock before entering suspend //Add a timer to trigger wakelock debug pr_info("[PM]unattended_timer: del_timer (late_resume)\n"); del_timer(&unattended_timer); //[---]Debug for active wakelock before entering suspend } mutex_unlock(&autosleep_lock); return 0; }
static void try_to_suspend(struct work_struct *work) { unsigned int initial_count, final_count; int error = 0; #ifdef CONFIG_PM_SLEEP_HISTORY int i; static unsigned int autosleep_active; static struct wakeup_source *last_ws[4]; struct timespec ts; if (autosleep_active == 0) { autosleep_active = 1; getnstimeofday(&ts); sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_ENTRY, &ts, NULL); } #endif if (!pm_get_wakeup_count(&initial_count, true)) goto out; mutex_lock(&autosleep_lock); if (!pm_save_wakeup_count(initial_count)) { mutex_unlock(&autosleep_lock); goto out; } #ifdef CONFIG_PM_SLEEP_HISTORY memset(last_ws, 0, sizeof(last_ws)); pm_get_last_wakeup_sources(&last_ws[0], sizeof(last_ws)/sizeof(struct wakeup_source *)); autosleep_active = 0; getnstimeofday(&ts); if (last_ws[0]) { sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_EXIT, &ts, last_ws[0]); for (i = 1; last_ws[i] && i < sizeof(last_ws)/sizeof(struct wakeup_source *); i++) sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_EXIT, NULL, last_ws[i]); memset(last_ws, 0, sizeof(last_ws)); } else sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_EXIT, &ts, autosleep_ws); #endif if (autosleep_state == PM_SUSPEND_ON) { mutex_unlock(&autosleep_lock); return; } if (autosleep_state >= PM_SUSPEND_MAX) hibernate(); else error = pm_suspend(autosleep_state); mutex_unlock(&autosleep_lock); #ifdef CONFIG_PM_SLEEP_HISTORY if (autosleep_active == 0) { autosleep_active = 1; getnstimeofday(&ts); sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_ENTRY, &ts, NULL); } if (error) goto out; if (!pm_get_wakeup_count(&final_count, false)) { __pm_wakeup_event(autosleep_ws, AUTOSLEEP_SUSPEND_BLOCK_TIME); goto out; } #else if (error) goto out; if (!pm_get_wakeup_count(&final_count, false)) { __pm_wakeup_event(autosleep_ws, AUTOSLEEP_SUSPEND_BLOCK_TIME); goto out; } #endif /* * If the wakeup occured for an unknown reason, wait to prevent the * system from trying to suspend and waking up in a tight loop. */ if (final_count == initial_count) schedule_timeout_uninterruptible(HZ / 2); out: #ifdef CONFIG_PM_SLEEP_HISTORY memset(last_ws, 0, sizeof(last_ws)); pm_get_last_wakeup_sources(&last_ws[0], sizeof(last_ws)/sizeof(struct wakeup_source *)); if (autosleep_state == PM_SUSPEND_ON) { autosleep_active = 0; getnstimeofday(&ts); if (last_ws[0]) { sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_EXIT, &ts, last_ws[0]); for (i = 1; last_ws[i] && i < sizeof(last_ws)/sizeof(struct wakeup_source *); i++) sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_EXIT, NULL, last_ws[i]); memset(last_ws, 0, sizeof(last_ws)); } else sleep_history_marker(SLEEP_HISTORY_AUTOSLEEP_EXIT, &ts, autosleep_ws); } #endif /* * If the device failed to suspend, wait to prevent the * system from trying to suspend and waking up in a tight loop. */ if (error) { pr_info("PM: suspend returned(%d)\n", error); schedule_timeout_uninterruptible(HZ / 2); } queue_up_suspend_work(); }