suspend
第三、四、五階段:platform
、processor
、core
static int suspend_enter(suspend_state_t state)
error = dpm_suspend_noirq(pmsg_suspend);
// 對於一些non-sysdev devices
,需要呼叫禁止中斷的dpm_suspend
函式來suspend
那些裝置
if (error)
if (suspend_ops->prepare_late)
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)
arch_suspend_enable_irqs();
bug_on(irqs_disabled());
enable_cpus:
enable_nonboot_cpus();
platform_wake:
if (suspend_ops->wake) //
平台無定義
suspend_ops->wake();
power_up_devices:
dpm_resume_noirq(pmsg_resume);
platfrom_finish:
if (suspend_ops->finish) //
做和函式suspend_ops->prepare()
相反的工作
suspend_ops->finish();
return error; }
static int mtk_pm_enter(suspend_state_t state)
int _chip_pm_enter(suspend_state_t state)
return 0; }
void mt6516_pm_suspendenter(void)
#endif}
else
} slp_exit:
wifi_lowpower_opt(false);
/* restore interrupt mask ; */
*mt6516_irq_maskl = irqmask_l;
*mt6516_irq_maskh = irqmask_h; }
函式mt6516_cpususpend (u4suspendaddr, u32tcm)
是一段彙編**,在檔案:
kernel/arch/arm/amch-mt6516/mt6516_slpctrl.s
中。下面是這段彙編**片段,看一看也蠻有意思,因為處理進入low power
模式之後,是停留在該函式之中的。
entry(mt6516_cpususpend)
stmfd sp!,
// r0 = mt6516_cpususpend physical address,
// r1 = tcm address
mov r4, r0
mov r9, r1
// set svc mode
mrs r0, cpsr
bic r0, r0, #mode_mask1
orr r1, r0, #mode_svc
// set i/f bit, disable irq and fiq
orr r1, r1, #i_bit|f_bit
// update cpsr
msr cpsr_cxsf, r1
// calculate the physical address of instruction after disable mmu
ldr r0, =physicalpart
ldr r1, =mt6516_cpususpend
sub r0, r0, r1
mov r1, r4
// now r0 is the physical address of physicalpart
add r0, r0, r1
......
// power down cache and mmu, mcu_mem_pdn
ldr r0, =0xf0001308
ldr r1, [r0]
// ldr r1, =0xffffffff
orr r1, r1, #0x0f
str r1, [r0]
// step1: set ap sleep (irq code: 0x36) to level sensitive on cirq.
// already done when system start.
// step2: unmask ap sleep ctrl interrupt.
// already done at mt6516_pm_maskinterrupt.
// step3: eoi ap sleep interrupt.
// already done at mt6516_pm_maskinterrupt.
// step4: read clear ap_sm_sta (oxf003c21c).
// already done at mt6516_pm_maskinterrupt.
標準linu休眠和喚醒機制分析 一
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...
標準linu休眠和喚醒機制分析 一
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案 apm和 acpi 比較.doc linux 系統的休眠與喚醒簡介 doc 3.本文先研究標準 linux 的休眠與喚醒,android 對這部分的增改在另一篇文章中討論 4....
標準linu休眠和喚醒機制分析 一
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...