/**
* hibernation_restore - quiesce devices and restore the hibernation
* snapshot image. If successful, control returns in hibernation_snaphot()
* @platform_mode - if set, use the platform driver, if available, to
* prepare the platform firmware for the transition.
*
* Must be called with pm_mutex held
*/
int hibernation_restore(int platform_mode)
{
int error;
gfp_t saved_mask;
pm_prepare_console();
suspend_console();
saved_mask = clear_gfp_allowed_mask(GFP_IOFS);
error = dpm_suspend_start(PMSG_QUIESCE);
if (!error) {
error = resume_target_kernel(platform_mode);
dpm_resume_end(PMSG_RECOVER);
}
set_gfp_allowed_mask(saved_mask);
resume_console();
pm_restore_console();
return error;
}
根據 comment, run 完會回到 hibernate_snapshot( ) , 猜是 stack 變更,所以這個 function return 回去會到 hibnation_snapshot( ).卡在 kernel_imx/driver/base/power/main.c 的 dpm_resume( ) 的:
while (!list_empty(&dpm_list)) {
dev = to_device(dpm_list.next);
get_device(dev);
if (dev->power.status >= DPM_OFF && !is_async(dev)) {
int error;
mutex_unlock(&dpm_list_mtx);
error = device_resume(dev, state, false);
mutex_lock(&dpm_list_mtx);
if (error)
pm_dev_err(dev, state, "", error);
} else if (dev->power.status == DPM_SUSPENDING) {
/* Allow new children of the device to be registered */
dev->power.status = DPM_RESUMING;
}
if (!list_empty(&dev->power.entry))
list_move_tail(&dev->power.entry, &list);
put_device(dev);
}
中間有 mmc0: error -110 during reumse (card was remved?) 的 error.==> 拿掉 mmc0 的 driver ,雖然 error 不再發生了,但是還是一樣卡住...約 48 sec 後才完成這個section。
拿掉 使用 dma 的 uart 後,經過 48 sec 的 resume後,沒有 core dump 了, kernel msg 可以正常的輸出,但是 console input 還是沒回應。
==> 將所有uart 的 DMA 都關掉後,雖然還是要 48 sec,但是 resume 後已經沒有 core dump 了 .... console 依然不回應 ..
在 get_device( )後印出 device 的 init_name,還有 dev->driver->name。發現好像是 pmic_adc 和 pmic_leds 卡住。
拿掉 pmic_led, pmic_backlight (從 menuconfig 拿掉).
==> 剩下 pmic_adc 需要 10 幾秒的 resume 時間,而且是卡在 pmic_adc_resume( ) 中..
拿掉 pmic_adc_resume( ) 中 對 register 的 read/write code 後,就沒有卡住了。
==> 但是 console 還是沒反應..
拿到 uboot 的 resume=? 參數,等開機進入 kernel 後,再用手動 echo 179:4 > /sys/power/resume
==> console 有反應.....所以原因是? .. root 是 ramdisk ?.. console not setup correctly ?
因為 android dev 在 mmcblk 加入一層 block,和kernel 不一樣。
所以,在kernel boot phase,要用以前的 /dev/mmcblk0p4,而不是開機完後的,/dev/block/mmcblk0p4
沒有留言:
張貼留言