/* static int notrace mcpm_powerdown_finisher(unsigned long arg) { u32 mpidr = read_cpuid_mpidr(); u32 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); u32 this_cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); mcpm_set_entry_vector(cpu, this_cluster, cpu_resume); mcpm_cpu_suspend(arg); return 1; } */ static int mmp_pm_enter(suspend_state_t state) { unsigned int real_idx = mmp_suspend->suspend_state; #ifdef CONFIG_SEC_GPIO_DVS /************************ Caution !!! **************************** This function must be located in appropriate SLEEP position in accordance with the specification of each BB vendor. ************************ Caution !!! ****************************/ gpio_dvs_check_sleepgpio(); #endif if (mmp_suspend->ops->pre_suspend_check) { if (mmp_suspend->ops->pre_suspend_check()) return -EAGAIN; } cpu_suspend((unsigned long)&real_idx); if (mmp_suspend->ops->post_chk_wakeup) detect_wakeup_status = mmp_suspend->ops->post_chk_wakeup(); if (mmp_suspend->ops->post_clr_wakeup) mmp_suspend->ops->post_clr_wakeup(detect_wakeup_status); if (real_idx != mmp_suspend->suspend_state) pr_info("WARNING!!! Suspend Didn't enter the Expected Low power mode\n"); mcpm_cpu_powered_up(); return 0; }
static int exynos_pm_enter(suspend_state_t state) { int ret; printk("%s: state %d\n", __func__, state); exynos_cpu_prepare(); #ifdef CONFIG_SEC_GPIO_DVS /* This function must be located in appropriate SLEEP position * in accordance with the specification of each BB vendor. */ gpio_dvs_check_sleepgpio(); #endif ret = cpu_suspend(0, exynos_cpu_suspend); if(ret) return ret; printk("%s: post sleep, preparing to return\n", __func__); return 0; }
/** * suspend_enter - Make the system enter the given sleep state. * @state: System sleep state to enter. * @wakeup: Returns information that the sleep state should not be re-entered. * * This function should be called after devices have been suspended. */ static int suspend_enter(suspend_state_t state, bool *wakeup) { int error; #ifdef CONFIG_SEC_GPIO_DVS /************************ Caution !!! ****************************/ /* This function must be located in appropriate SLEEP position * in accordance with the specification of each BB vendor. */ /************************ Caution !!! ****************************/ gpio_dvs_check_sleepgpio(); #ifdef SECGPIO_SLEEP_DEBUGGING /************************ Caution !!! ****************************/ /* This func. must be located in an appropriate position for GPIO SLEEP debugging * in accordance with the specification of each BB vendor, and * the func. must be called after calling the function "gpio_dvs_check_sleepgpio" */ /************************ Caution !!! ****************************/ gpio_dvs_set_sleepgpio(); #endif #endif if (suspend_ops->prepare) { error = suspend_ops->prepare(); if (error) goto Platform_finish; } error = dpm_suspend_end(PMSG_SUSPEND); if (error) { printk(KERN_ERR "PM: Some devices failed to power down\n"); goto Platform_finish; } if (suspend_ops->prepare_late) { error = suspend_ops->prepare_late(); if (error) goto Platform_wake; } if (suspend_test(TEST_PLATFORM)) goto Platform_wake; error = disable_nonboot_cpus(); if (error || suspend_test(TEST_CPUS)) goto Enable_cpus; arch_suspend_disable_irqs(); BUG_ON(!irqs_disabled()); error = syscore_suspend(); if (!error) { *wakeup = pm_wakeup_pending(); if (!(suspend_test(TEST_CORE) || *wakeup)) { error = suspend_ops->enter(state); events_check_enabled = false; } syscore_resume(); } arch_suspend_enable_irqs(); BUG_ON(irqs_disabled()); Enable_cpus: enable_nonboot_cpus(); Platform_wake: if (suspend_ops->wake) suspend_ops->wake(); dpm_resume_start(PMSG_RESUME); Platform_finish: if (suspend_ops->finish) suspend_ops->finish(); return error; }
/** * suspend_enter - Make the system enter the given sleep state. * @state: System sleep state to enter. * @wakeup: Returns information that the sleep state should not be re-entered. * * This function should be called after devices have been suspended. */ static int suspend_enter(suspend_state_t state, bool *wakeup) { int error; #ifdef CONFIG_SEC_GPIO_DVS /************************ Caution !!! ****************************/ /* This function must be located in appropriate SLEEP position * in accordance with the specification of each BB vendor. */ /************************ Caution !!! ****************************/ gpio_dvs_check_sleepgpio(); #ifdef SECGPIO_SLEEP_DEBUGGING /************************ Caution !!! ****************************/ /* This func. must be located in an appropriate position for GPIO SLEEP debugging * in accordance with the specification of each BB vendor, and * the func. must be called after calling the function "gpio_dvs_check_sleepgpio" */ /************************ Caution !!! ****************************/ gpio_dvs_set_sleepgpio(); #endif #endif if (need_suspend_ops(state) && suspend_ops->prepare) { error = suspend_ops->prepare(); if (error) goto Platform_finish; } error = dpm_suspend_end(PMSG_SUSPEND); if (error) { printk(KERN_ERR "PM: Some devices failed to power down\n"); goto Platform_finish; } if (need_suspend_ops(state) && suspend_ops->prepare_late) { error = suspend_ops->prepare_late(); if (error) goto Platform_wake; } if (suspend_test(TEST_PLATFORM)) goto Platform_wake; /* * PM_SUSPEND_FREEZE equals * frozen processes + suspended devices + idle processors. * Thus we should invoke freeze_enter() soon after * all the devices are suspended. */ if (state == PM_SUSPEND_FREEZE) { freeze_enter(); goto Platform_wake; } error = disable_nonboot_cpus(); if (error || suspend_test(TEST_CPUS)) goto Enable_cpus; arch_suspend_disable_irqs(); BUG_ON(!irqs_disabled()); error = syscore_suspend(); if (!error) { *wakeup = pm_wakeup_pending(); if (!(suspend_test(TEST_CORE) || *wakeup)) { error = suspend_ops->enter(state); events_check_enabled = false; } syscore_resume(); } #if defined(CONFIG_SEC_GPIO_DVS) && defined(SECGPIO_SLEEP_DEBUGGING) /************************ Caution !!! ****************************/ /* This function must be located in an appropriate position * to undo gpio SLEEP debugging setting when DUT wakes up. * It should be implemented in accordance with the specification of each BB vendor. */ /************************ Caution !!! ****************************/ gpio_dvs_undo_sleepgpio(); #endif arch_suspend_enable_irqs(); BUG_ON(irqs_disabled()); Enable_cpus: enable_nonboot_cpus(); Platform_wake: if (need_suspend_ops(state) && suspend_ops->wake) suspend_ops->wake(); dpm_resume_start(PMSG_RESUME); Platform_finish: if (need_suspend_ops(state) && suspend_ops->finish) suspend_ops->finish(); return error; }