suspend第三、四、五阶段:platform、processor、core
static int suspend_enter(suspend_state_t state)
{
int error;
if (suspend_ops->prepare) {
// 平台特定的函数,mtkpm.c, 有定义,对pmic和cpu dll的一些设置
error = suspend_ops->prepare();
if (error)
return error;
}
error = dpm_suspend_noirq(PMSG_SUSPEND);
// 对于一些non-sysdev devices,需要调用禁止中断的dpm_suspend函数来suspend那些设备
if (error) {
printk(KERN_ERR "PM: Some devices failed to power down/n");
goto Platfrom_finish;
}
if (suspend_ops->prepare_late) { // 这里没定义
error = suspend_ops->prepare_late();
if (error)
goto Power_up_devices;
}
if (suspend_test(TEST_PLATFORM)) // suspend第3阶段到此为止
goto Platform_wake;
error = disable_nonboot_cpus(); // disable nonboot cpus
if (error || suspend_test(TEST_CPUS)) // suspend第4阶段到此为止
goto Enable_cpus;
arch_suspend_disable_irqs(); // 中断禁止
BUG_ON(!irqs_disabled());
error = sysdev_suspend(PMSG_SUSPEND); // kernel/driver/base/sys.c
// suspend system devices
if (!error) {
if (!suspend_test(TEST_CORE)) // suspend第5阶段到此为止
error = suspend_ops->enter(state);
// 真正才进入suspend,调用的函数时平台特定的suspend enter函数, // mtkpm.c, 在下面列出mtk平台的该函数实现,供分析:
// 如果有唤醒源被操作,那么处理将会被wakeup,先做一些平台相 // 关的动作,最后从函数suspend_ops->enter()中返回,这之后的唤 // 醒操作实际上是按照suspend流程的相反顺序的来走的。
sysdev_resume(); // resuem system devices
// 跳到本文档最后面,将会有一个总结,这里会展示出正常的suspend和resume的时候函数调用
}
arch_suspend_enable_irqs();
BUG_ON(irqs_disabled());
Enable_cpus:
enable_nonboot_cpus();
Platform_wake:</