static inline int snapshot_restore(int platform_suspend) { int error; mutex_lock(&pm_mutex); pm_prepare_console(); if (platform_suspend) { error = platform_prepare(); if (error) goto Finish; } suspend_console(); error = device_suspend(PMSG_PRETHAW); if (error) goto Resume_devices; error = disable_nonboot_cpus(); if (!error) error = swsusp_resume(); enable_nonboot_cpus(); Resume_devices: if (platform_suspend) platform_finish(); device_resume(); resume_console(); Finish: pm_restore_console(); mutex_unlock(&pm_mutex); return error; }
static int prepare_processes(void) { int error = 0; pm_prepare_console(); error = disable_nonboot_cpus(); if (error) goto enable_cpus; if (freeze_processes()) { error = -EBUSY; goto thaw; } if (pm_disk_mode == PM_DISK_TESTPROC) { printk("swsusp debug: Waiting for 5 seconds.\n"); mdelay(5000); goto thaw; } error = platform_prepare(); if (error) goto thaw; /* Free memory before shutting down devices. */ if (!(error = swsusp_shrink_memory())) return 0; platform_finish(); thaw: thaw_processes(); enable_cpus: enable_nonboot_cpus(); pm_restore_console(); return error; }
static inline int snapshot_suspend(int platform_suspend) { int error; mutex_lock(&pm_mutex); /* Free memory before shutting down devices. */ error = swsusp_shrink_memory(); if (error) goto Finish; if (platform_suspend) { error = platform_prepare(); if (error) goto Finish; } suspend_console(); error = device_suspend(PMSG_FREEZE); if (error) goto Resume_devices; error = disable_nonboot_cpus(); if (!error) { in_suspend = 1; error = swsusp_suspend(); } enable_nonboot_cpus(); Resume_devices: if (platform_suspend) platform_finish(); device_resume(); resume_console(); Finish: mutex_unlock(&pm_mutex); return error; }
int pm_suspend_disk(void) { int error; error = prepare_processes(); if (error) return error; if (pm_disk_mode == PM_DISK_TESTPROC) { printk("swsusp debug: Waiting for 5 seconds.\n"); mdelay(5000); goto Thaw; } /* Allocate memory management structures */ error = create_basic_memory_bitmaps(); if (error) goto Thaw; /* Free memory before shutting down devices. */ error = swsusp_shrink_memory(); if (error) goto Finish; error = platform_prepare(); if (error) goto Finish; suspend_console(); error = device_suspend(PMSG_FREEZE); if (error) { printk(KERN_ERR "PM: Some devices failed to suspend\n"); goto Resume_devices; } error = disable_nonboot_cpus(); if (error) goto Enable_cpus; if (pm_disk_mode == PM_DISK_TEST) { printk("swsusp debug: Waiting for 5 seconds.\n"); mdelay(5000); goto Enable_cpus; } pr_debug("PM: snapshotting memory.\n"); in_suspend = 1; error = swsusp_suspend(); if (error) goto Enable_cpus; if (in_suspend) { enable_nonboot_cpus(); platform_finish(); device_resume(); resume_console(); pr_debug("PM: writing image.\n"); error = swsusp_write(); if (!error) power_down(pm_disk_mode); else { swsusp_free(); goto Finish; } } else { pr_debug("PM: Image restored successfully.\n"); } swsusp_free(); Enable_cpus: enable_nonboot_cpus(); Resume_devices: platform_finish(); device_resume(); resume_console(); Finish: free_basic_memory_bitmaps(); Thaw: unprepare_processes(); return error; }
/** * hom_freeze_devices_and_enter - * freeze devices and enter in hibernation on memory */ static int hibernation_on_memory_enter(void) { int error = 0; unsigned long pe_counter; if (!hom_ops) return -ENOSYS; pr_debug("[STM]:[PM]: platform_begin\n"); error = platform_begin(); if (error) goto Close; suspend_console(); pr_debug("[STM]:[PM]: Suspend devices\n"); error = dpm_suspend_start(PMSG_FREEZE); if (error) goto Resume_devices; pr_debug("[STM]:[PM]: Suspend devices (noirq)\n"); error = dpm_suspend_noirq(PMSG_FREEZE); if (error) goto Resume_devices_noirq; error = disable_nonboot_cpus(); if (error) goto Enable_cpus; local_irq_disable(); pr_debug("[STM]:[PM]: Suspend sysdevices\n"); error = sysdev_suspend(PMSG_FREEZE); if (error) goto Enable_irqs; pr_debug("[STM]:[PM]: platform_prepare\n"); error = platform_prepare(); if (error) { pr_err("[STM]:[PM]: platform_prepare has refused the HoM\n"); goto Skip_enter; } pr_debug("[STM]:[PM]: platform_enter\n"); pe_counter = preempt_count(); platform_enter(); BUG_ON(pe_counter != preempt_count()); Skip_enter: pr_debug("[STM]:[PM]: platform_complete\n"); platform_complete(); pr_debug("[STM]:[PM]: Resumed sysdevices\n"); sysdev_resume(); Enable_irqs: local_irq_enable(); Enable_cpus: enable_nonboot_cpus(); Resume_devices_noirq: pr_debug("[STM]:[PM]: Resume devices (noirq)\n"); dpm_resume_noirq(PMSG_RESTORE); Resume_devices: pr_debug("[STM]:[PM]: Resume devices\n"); dpm_resume_end(PMSG_RESTORE); resume_console(); Close: pr_debug("[STM]:[PM]: platform_end\n"); platform_end(); pr_debug("[STM]:[PM]: exit\n"); return error; }