android power manager 之 suspend resume过程

转载请标注原文地址:http://blog.csdn.net/uranus_wm/article/details/11569913

 

平台:android4.0 + samsung exynos4412

 

android power manager主要包括:wake_lock -> setScreenState(off)  -> request_suspend_state -> early_suspend -> wake_unlock -> suspend -> late suspend -> sleep -> wakeup -> early resume -> resume -> late resume 这样一个过程

应为resume和suspend基本是一个逆过程,所以本文章重点介绍的都是suspend过程

除了sleep -> wakeup 是和平台相关的,其他部分是平台无关的,本文主要介绍平台无关部分,下面一篇文章将主要介绍sleep -> wakeup部分

文章地址:http://blog.csdn.net/uranus_wm/article/details/11635381

 

大致过程如下:

android framework部分:

1. wakelock:framework和kernel都可以对WAKE_LOCK进行加锁,解锁;

申请了WAKE_LOCK则系统不会进入休眠状态,系统运行时很多app都会使用WAKE_LOCK加锁,以阻止系统休眠

因此app必须确保退出之后使用wake_unlock解锁,否则系统功耗会很有问题,关于WAKE_LOCK本文不做详细介绍

framework文件位置:/frameworks/base/core/java/android/os/PowerManager.java

[cpp]  view plain copy
  1. private static final int WAKE_BIT_CPU_STRONG = 1;  
  2. private static final int WAKE_BIT_CPU_WEAK = 2;  
  3. private static final int WAKE_BIT_SCREEN_DIM = 4;  
  4. private static final int WAKE_BIT_SCREEN_BRIGHT = 8;  
  5. private static final int WAKE_BIT_KEYBOARD_BRIGHT = 16;  
  6. private static final int WAKE_BIT_PROXIMITY_SCREEN_OFF = 32;  
  7.   
  8. /* 确保CPU为运行状态,lcd屏幕有可能是关闭状态*/  
  9. public static final int PARTIAL_WAKE_LOCK = WAKE_BIT_CPU_STRONG;  
  10.   
  11. /* 确保lcd背光和键盘灯处于全亮状态*/  
  12. public static final int FULL_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_BRIGHT   
  13.                                         | WAKE_BIT_KEYBOARD_BRIGHT;  
  14.   
  15. /* 确保lcd背光亮,但可能是半亮,键盘灯允许熄灭*/  
  16. public static final int SCREEN_DIM_WAKE_LOCK = WAKE_BIT_CPU_WEAK | WAKE_BIT_SCREEN_DIM;  
  17.   
  18. /* 由近距离感应器决定lcd背光灭*/  
  19. public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = WAKE_BIT_PROXIMITY_SCREEN_OFF;  

 2. setScreenState(off) ;  //lcd关闭,背光熄灭后,设置"/sys/power/state" 为"mem"
文件位置:/frameworks/base/services/java/com/android/server/PowerManagerService.java

[java]  view plain copy
  1. private int setScreenStateLocked(boolean on) {  
  2.   
  3.         int err = Power.setScreenState(on);  
  4. }  
  5.   
  6. public static native int setScreenState(boolean on);  

 3. native部分:直接使用write函数对sys文件系统进行写操作
文件位置:/hardware/libhardware_legacy/power/power.c

[cpp]  view plain copy
  1. const char * const NEW_PATHS[] = {  
  2.     "/sys/power/wake_lock",  
  3.     "/sys/power/wake_unlock",  
  4.     "/sys/power/state"  
  5. };  
  6.   
  7. static const char *off_state = "mem";  
  8. static const char *on_state = "on";  
  9.   
  10. int set_screen_state(int on)  
  11. {  
  12.     if(on)  
  13.         len = snprintf(buf, sizeof(buf), "%s", on_state);  
  14.     else  
  15.         len = snprintf(buf, sizeof(buf), "%s", off_state);  
  16.   
  17.     buf[sizeof(buf) - 1] = '\0';  
  18.     len = write(g_fds[REQUEST_STATE], buf, len);  
  19. }  

kernel部分:power manager相关文件基本都在 /kernel/power/ 目录下
4. "/sys/power/state"被写入"mem"后,state_store函数被调用
这个调用机制需要了解linux的sysfs和kobject,以后再详细介绍
文件位置:/kernel/power/main.c

[cpp]  view plain copy
  1. static int __init pm_init(void){   
  2.  power_kobj = kobject_create_and_add("power", NULL);  
  3.  return sysfs_create_group(power_kobj, &attr_group);  
  4. }  
  5.   
  6. core_initcall(pm_init);  
  7.   
  8. power_attr(state);  
  9.   
  10. #define power_attr(_name) \  
  11. static struct kobj_attribute _name##_attr = {   \  
  12.     .attr   = {             \  
  13.         .name = __stringify(_name), \  
  14.         .mode = 0644,           \  
  15.     },                  \  
  16.     .show   = _name##_show,         \  
  17.     .store  = _name##_store,        \  
  18. }  
  19.   
  20. static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,  
  21.       const char *buf, size_t n)  
  22. {  
  23. #ifdef CONFIG_SUSPEND  
  24. #ifdef CONFIG_EARLYSUSPEND  
  25.  suspend_state_t state = PM_SUSPEND_ON;  
  26. #else  
  27.  suspend_state_t state = PM_SUSPEND_STANDBY;  
  28. #endif  
  29.  const char * const *s;  
  30. #endif  
  31.   
  32.   
  33. #ifdef CONFIG_SUSPEND  
  34.  for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) {  
  35.   if (*s && len == strlen(*s) && !strncmp(buf, *s, len))  
  36.    break;  
  37.  }  
  38.  if (state < PM_SUSPEND_MAX && *s)  
  39. #ifdef CONFIG_EARLYSUSPEND  
  40.   if (state == PM_SUSPEND_ON || valid_state(state)) {  
  41.    error = 0;  
  42.    request_suspend_state(state);  
  43.   }  
  44. #else  
  45.   error = enter_state(state);  
  46. #endif  
  47. #endif  
  48. }  

 5. 上一步request_suspend_state(PM_SUSPEND_ON)请求进入early_suspend

early_suspend是google在标准linux上增加的特性

[cpp]  view plain copy
  1. typedef int __bitwise suspend_state_t;  
  2.   
  3. #define PM_SUSPEND_ON  ((__force suspend_state_t) 0)  
  4. #define PM_SUSPEND_STANDBY ((__force suspend_state_t) 1)  
  5. #define PM_SUSPEND_MEM  ((__force suspend_state_t) 3)  
  6. #define PM_SUSPEND_MAX  ((__force suspend_state_t) 4)  
  7.   
  8. void request_suspend_state(suspend_state_t new_state)  
  9. {  
  10.  unsigned long irqflags;  
  11.  int old_sleep;  
  12.   
  13. /* 如果old状态为PM_SUSPEND_ON,即唤醒状态,请求状态不为PM_SUSPEND_ON 则进入early_suspend过程  */  
  14.   
  15. /* 不论old状态,只要请求状态为PM_SUSPEND_ON,即唤醒状态,则进入late_resume过程  */  
  16.   
  17. /* 这块if else判断语句有点别扭,要好好理解下*/  
  18.   
  19.  if (!old_sleep && new_state != PM_SUSPEND_ON) {  
  20.   state |= SUSPEND_REQUESTED;  
  21.   queue_work(suspend_work_queue, &early_suspend_work);  
  22.  } else if (old_sleep && new_state == PM_SUSPEND_ON) {  
  23.   state &= ~SUSPEND_REQUESTED;  
  24.   wake_lock(&main_wake_lock);  
  25.   queue_work(suspend_work_queue, &late_resume_work);  
  26.  }  
  27.  requested_suspend_state = new_state;  
  28.  spin_unlock_irqrestore(&state_lock, irqflags);  
  29. }  

注册early_suspend的一般是lcd,tvout,TP等提供给用户输入输出的设备;

最早休眠,最后唤醒,这样做是为了防止设备没有彻底resume,而用户已经有输入动作

这类设备可以在probe函数中注册early_syspend相关ops函数

[cpp]  view plain copy
  1. #ifdef CONFIG_HAS_EARLYSUSPEND  
  2.  ft5x0x_ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;  
  3.  ft5x0x_ts->early_suspend.suspend = ft5x0x_ts_suspend;  
  4.  ft5x0x_ts->early_suspend.resume = ft5x0x_ts_resume;  
  5.  register_early_suspend(&ft5x0x_ts->early_suspend);  
  6. #endif  
  7.   
  8. 文件位置:/kernel/linux/earlysuspend.h  
  9.   
  10. enum {  
  11.  EARLY_SUSPEND_LEVEL_BLANK_SCREEN = 50,  
  12.  EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,  
  13.  EARLY_SUSPEND_LEVEL_DISABLE_FB = 150,  
  14. };  


上面有一个level值的定义,注册suspend回调函数的设备按照level值由低到高的顺序被回调进入睡眠,可以看到最后执行的是操作framebuffer设备被disable。

在函数early_suspend最后wake_unlock(&main_wake_lock),这是android专门为early suspend加的一个wakelock锁

在所有注册early_suspend的设备正确返回后才放开,否则系统无法进入下一步suspend。

[java]  view plain copy
  1. static void early_suspend(struct work_struct *work)  
  2. {  
  3.  sys_sync();  
  4. abort:  
  5.  spin_lock_irqsave(&state_lock, irqflags);  
  6.  if (state == SUSPEND_REQUESTED_AND_SUSPENDED)  
  7.   wake_unlock(&main_wake_lock);  
  8.  spin_unlock_irqrestore(&state_lock, irqflags);  
  9. }  

 回到wakelock:判断是否还有wakeup存在,如果有退出等待锁释放,如果没有则进入suspend状态

一般来说main_wake_lock释放,基本其他wakelock也应该释放了。

文件位置:/kernel/power/wakelock.c

[java]  view plain copy
  1. void wake_unlock(struct wake_lock *lock)  
  2. {  
  3.  if (type == WAKE_LOCK_SUSPEND) {  
  4.   long has_lock = has_wake_lock_locked(type);  
  5.   if (has_lock > 0) {  
  6.    if (debug_mask & DEBUG_EXPIRE)  
  7.     pr_info("wake_unlock: %s, start expire timer, "  
  8.      "%ld\n", lock->name, has_lock);  
  9.    mod_timer(&expire_timer, jiffies + has_lock);  
  10.   } else {  
  11.    if (del_timer(&expire_timer))  
  12.     if (debug_mask & DEBUG_EXPIRE)  
  13.      pr_info("wake_unlock: %s, stop expire "  
  14.       "timer\n", lock->name);  
  15.    if (has_lock == 0)  
  16.     queue_work(suspend_work_queue, &suspend_work);  
  17.   }  
  18.   if (lock == &main_wake_lock) {  
  19.    if (debug_mask & DEBUG_SUSPEND)  
  20.     print_active_locks(WAKE_LOCK_SUSPEND);  
  21. #ifdef CONFIG_WAKELOCK_STAT  
  22.    update_sleep_wait_stats_locked(0);  
  23. #endif  
  24.   }  
  25.  }  
  26. }  
  27. EXPORT_SYMBOL(wake_unlock);  

6. 走到suspend这直到系统睡眠和后面唤醒直到resume这两个过程基本是成对反向的过程,一旦进入suspend程序不能随意跳出,

必须按照逆向操作返回,否则可能出现系统不稳定或者功耗问题

基本就是按部就班,我把主要的代码贴一下,后面再贴一份4412在休眠前后的log,suspend主要就是回调外设驱动注册的两个pm_ops函数,例如:

[cpp]  view plain copy
  1. static const struct dev_pm_ops gpio_switch_pm_ops = {  
  2.     .suspend    = gpio_switch_suspend,  
  3.     .resume     = gpio_switch_resume,  
  4. };  

具体suspend过程代码如下:
这里有两个全局变量:suspend_short_count和current_event_num

suspend_short_count的作用:如果系统进入suspend执行时间很短就退出,而后又重新进入suspend操作10次,

则系统认为存在某外部时间,则延长进入suspend的时间间隔

current_event_num是个自增变量,只增不减,在启动不带定时器的wake_lock时加一,作用是在suspend失败返回时

如果没有产生其他的wake_lock,则启动一个带定时器HZ / 2周期的wake_lock,保证能快速重新进行suspend流程

[cpp]  view plain copy
  1. <p>static void suspend(struct work_struct *work)  
  2. {  
  3. </p><p> entry_event_num = current_event_num;  
  4.  ret = pm_suspend(requested_suspend_state);  
  5. </p><p> </p><p>if (ts_exit.tv_sec - ts_entry.tv_sec <= 1) {  
  6.   ++suspend_short_count;</p><p>  if (suspend_short_count == SUSPEND_BACKOFF_THRESHOLD) {  
  7.    suspend_backoff();  
  8.    suspend_short_count = 0;  
  9.   }  
  10.  } else {  
  11.   suspend_short_count = 0;  
  12.  }</p><p> if (current_event_num == entry_event_num) {  
  13.   if (debug_mask & DEBUG_SUSPEND)  
  14.    pr_info("suspend: pm_suspend returned with no event\n");  
  15.   wake_lock_timeout(&unknown_wakeup, HZ / 2);  
  16.  }  
  17. }</p>int pm_suspend(suspend_state_t state)  
  18. {  
  19.  if (state > PM_SUSPEND_ON && state < PM_SUSPEND_MAX)  
  20.   return enter_state(state);  
  21.  return -EINVAL;  
  22. }  
  23.   
  24. int enter_state(suspend_state_t state)  
  25. {  
  26.  pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);  
  27.  error = suspend_prepare();  
  28.  pr_debug("PM: Entering %s sleep\n", pm_states[state]);  
  29.  error = suspend_devices_and_enter(state);  
  30.  Finish:  
  31.  pr_debug("PM: Finishing wakeup.\n");  
  32.  suspend_finish();  
  33. }  

在prepare时freeze用户空间进程*/

[cpp]  view plain copy
  1. static int suspend_prepare(void)  
  2. {  
  3.  pm_prepare_console();  
  4.   
  5.  error = pm_notifier_call_chain(PM_SUSPEND_PREPARE);  
  6.   
  7.   
  8.  error = usermodehelper_disable();  
  9.   
  10.   
  11.  error = suspend_freeze_processes();  
  12.  }  

dpm_suspend_start这就是回调所有非系统设备的suspend函数

而suspend_enter之后就是进入late_suspend过程

[cpp]  view plain copy
  1. int suspend_devices_and_enter(suspend_state_t state)  
  2. {  
  3.  suspend_console();  
  4.  suspend_test_start();  
  5.  error = dpm_suspend_start(PMSG_SUSPEND);  
  6.   
  7.   
  8.  error = suspend_enter(state);  
  9.   
  10.  Resume_devices:  
  11.  suspend_test_start();  
  12.  dpm_resume_end(PMSG_RESUME);  
  13.  suspend_test_finish("resume devices");  
  14.  resume_console();  
  15.  Close:  
  16.  if (suspend_ops->end)  
  17.   suspend_ops->end();  
  18.  trace_machine_suspend(PWR_EVENT_EXIT);  
  19.  return error;  
  20.   
  21.  Recover_platform:  
  22.  if (suspend_ops->recover)  
  23.   suspend_ops->recover();  
  24.  goto Resume_devices;  
  25. }  

7. late_suspend主要是完成系统级设备的休眠准备工作,这部分和平台相关性大

下面是进入late_suspend的相关调用,late_suspend前后还有芯片相关的平台级电源管理函数prepare和prepare_late的调用

[cpp]  view plain copy
  1. static int suspend_enter(suspend_state_t state)  
  2. {  
  3.     int error;  
  4.   
  5.     if (suspend_ops->prepare) {  
  6.         error = suspend_ops->prepare();  
  7.     }  
  8.   
  9.     error = dpm_suspend_noirq(PMSG_SUSPEND);  
  10.     if (error) {  
  11.         printk(KERN_ERR "PM: Some devices failed to power down\n");  
  12.         goto Platform_finish;  
  13.     }  
  14.   
  15.     if (suspend_ops->prepare_late) {  
  16.         error = suspend_ops->prepare_late();  
  17.     }  
  18.   
  19.     error = disable_nonboot_cpus();  
  20.     if (error || suspend_test(TEST_CPUS))  
  21.         goto Enable_cpus;  
  22.   
  23.     arch_suspend_disable_irqs();  
  24.     BUG_ON(!irqs_disabled());  
  25.   
  26.     error = syscore_suspend();  
  27.     if (!error) {  
  28.         if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {  
  29.             error = suspend_ops->enter(state);  
  30.             events_check_enabled = false;  
  31.         }  
  32.         syscore_resume();  
  33.     }  
  34.   
  35.     arch_suspend_enable_irqs();  
  36.     BUG_ON(irqs_disabled());  
  37.   
  38.  Enable_cpus:  
  39.     enable_nonboot_cpus();  
  40.   
  41.  Platform_wake:  
  42.     if (suspend_ops->wake)  
  43.         suspend_ops->wake();  
  44.   
  45.     dpm_resume_noirq(PMSG_RESUME);  
  46.   
  47.  Platform_finish:  
  48.     if (suspend_ops->finish)  
  49.         suspend_ops->finish();  
  50.   
  51.     return error;  
  52. }  

 注册late_suspend回调函数的一般是总线或者系统级别的设备,需要在外设关闭之后才能调用

例如:wake_lock虚拟设备,i2c,pci等系统总线,回调函数hook为:.suspend_noirq

[cpp]  view plain copy
  1. static struct dev_pm_ops power_driver_pm_ops = {  
  2.     .suspend_noirq = power_suspend_late,  
  3. };  
  4. /** 
  5.  * dpm_suspend_noirq - Execute "late suspend" callbacks for non-sysdev devices. 
  6.  * @state: PM transition of the system being carried out. 
  7.  * 
  8.  * Prevent device drivers from receiving interrupts and call the "noirq" suspend 
  9.  * handlers for all non-sysdev devices. 
  10.  */  
  11. int dpm_suspend_noirq(pm_message_t state)  
  12. {  
  13.     suspend_device_irqs();  
  14.     mutex_lock(&dpm_list_mtx);  
  15.     while (!list_empty(&dpm_suspended_list)) {  
  16.         struct device *dev = to_device(dpm_suspended_list.prev);  
  17.         get_device(dev);  
  18.         mutex_unlock(&dpm_list_mtx);  
  19.         error = device_suspend_noirq(dev, state);  
  20.         mutex_lock(&dpm_list_mtx);  
  21.     }  
  22.     mutex_unlock(&dpm_list_mtx);  
  23. }  
  24. EXPORT_SYMBOL_GPL(dpm_suspend_noirq);  

 suspend_ops->prepare和suspend_ops->prepare_late这几个是samsung平台的平台级电源管理函数

初始化时通过initcall注册,在late_suspend时被调用

[cpp]  view plain copy
  1. static const struct platform_suspend_ops s3c_pm_ops = {  
  2.     .enter      = s3c_pm_enter,  
  3.     .prepare    = s3c_pm_prepare,  
  4.     .finish     = s3c_pm_finish,  
  5.     .valid      = suspend_valid_only_mem,  
  6. };  
  7.   
  8. /* s3c_pm_init 
  9.  * 
  10.  * Attach the power management functions. This should be called 
  11.  * from the board specific initialisation if the board supports 
  12.  * it. 
  13. */  
  14.   
  15. int __init s3c_pm_init(void)  
  16. {  
  17.     suspend_set_ops(&s3c_pm_ops);  
  18.     return 0;  
  19. }  


8. 最后贴一段芯片睡眠前最后执行的代码,保存所有gpio状态,配置gpio为input low确保不漏电,设置唤醒中断,关闭其他中断等

cpu最终停止在s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET);这句

当然这只是针对s3c_pm_enter这个函数来说,该函数里面还要回调cpu的suspend函数,保存pc指针和睡眠状态

后面有一篇文章将重点介绍sleep前后系统需要做的事情和sleep后系统所处状态,以及如何保证系统resume过来

[cpp]  view plain copy
  1. static int s3c_pm_enter(suspend_state_t state)  
  2. {  
  3.     /* ensure the debug is initialised (if enabled) */  
  4.   
  5.     s3c_pm_debug_init();  
  6.   
  7.     S3C_PMDBG("%s(%d)\n", __func__, state);  
  8.   
  9.     if (pm_cpu_prep == NULL || pm_cpu_sleep == NULL) {  
  10.         printk(KERN_ERR "%s: error: no cpu sleep function\n", __func__);  
  11.         return -EINVAL;  
  12.     }  
  13.   
  14.     /* check if we have anything to wake-up with... bad things seem 
  15.      * to happen if you suspend with no wakeup (system will often 
  16.      * require a full power-cycle) 
  17.     */  
  18.   
  19.     if (!any_allowed(s3c_irqwake_intmask, s3c_irqwake_intallow) &&  
  20.         !any_allowed(s3c_irqwake_eintmask, s3c_irqwake_eintallow)) {  
  21.         printk(KERN_ERR "%s: No wake-up sources!\n", __func__);  
  22.         printk(KERN_ERR "%s: Aborting sleep\n", __func__);  
  23.         return -EINVAL;  
  24.     }  
  25.   
  26.     /* save all necessary core registers not covered by the drivers */  
  27.   
  28.     s3c_pm_save_gpios();  
  29.     s3c_pm_saved_gpios();  
  30.     s3c_pm_save_uarts();  
  31.     s3c_pm_save_core();  
  32.   
  33.     /* set the irq configuration for wake */  
  34.   
  35.     s3c_pm_configure_extint();  
  36.   
  37.     S3C_PMDBG("sleep: irq wakeup masks: %08lx,%08lx\n",  
  38.         s3c_irqwake_intmask, s3c_irqwake_eintmask);  
  39.   
  40.     s3c_pm_arch_prepare_irqs();  
  41.   
  42.     /* call cpu specific preparation */  
  43.   
  44.     pm_cpu_prep();  
  45.   
  46.     /* flush cache back to ram */  
  47.   
  48.     flush_cache_all();  
  49.   
  50.     s3c_pm_check_store();  
  51.   
  52.     /* send the cpu to sleep... */  
  53.   
  54.     s3c_pm_arch_stop_clocks();  
  55.   
  56.     /* s3c_cpu_save will also act as our return point from when 
  57.      * we resume as it saves its own register state and restores it 
  58.      * during the resume.  */  
  59.   
  60.     s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET);  
  61.   
  62.     /* restore the cpu state using the kernel's cpu init code. */  
  63.   
  64.     cpu_init();  
  65.   
  66.     s3c_pm_restore_core();  
  67.     s3c_pm_restore_uarts();  
  68.     s3c_pm_restore_gpios();  
  69.     s3c_pm_restored_gpios();  
  70.   
  71.     s3c_pm_debug_init();  
  72.   
  73.         /* restore the system state */  
  74.   
  75.     if (pm_cpu_restore)  
  76.         pm_cpu_restore();  
  77.   
  78.     /* check what irq (if any) restored the system */  
  79.   
  80.     s3c_pm_arch_show_resume_irqs();  
  81.   
  82.     S3C_PMDBG("%s: post sleep, preparing to return\n", __func__);  
  83.   
  84.     /* LEDs should now be 1110 */  
  85.     s3c_pm_debug_smdkled(1 << 1, 0);  
  86.   
  87.     s3c_pm_check_restore();  
  88.   
  89.     /* ok, let's return from sleep */  
  90.   
  91.     S3C_PMDBG("S3C PM Resume (post-restore)\n");  
  92.     return 0;  
  93. }  
  94. static void exynos4_pm_prepare(void){   /* Set value of power down register for sleep mode */   exynos4_sys_powerdown_conf(SYS_SLEEP);  __raw_writel(S5P_CHECK_SLEEP, REG_INFORM1); /* ensure at least INFORM0 has the resume address */    __raw_writel(virt_to_phys(s3c_cpu_resume), REG_INFORM0);    /* Before enter central sequence mode, clock src register have to set */    s3c_pm_do_restore_core(exynos4_set_clksrc, ARRAY_SIZE(exynos4_set_clksrc)); if (soc_is_exynos4210())        s3c_pm_do_restore_core(exynos4210_set_clksrc, ARRAY_SIZE(exynos4210_set_clksrc));}  

 最后黏贴一份suspend到resume的log,有助于代码分析:

[cpp]  view plain copy
  1. [   24.737997] has_wake_lock_locked: main  
  2.   
  3. [   24.740287] wake_unlock: has_lock -1, tyep 0   
  4.   
  5. [   26.089081] CPU2: shutdown  
  6.   
  7. [   26.557543] CPU3: shutdown  
  8.   
  9. [   27.368084] wake_lock: alarm, type 0, timeout 5.000  
  10.   
  11. [   27.368245] has_wake_lock_locked: main  
  12.   
  13. [   27.371112] wake_unlock: alarm_rtc  
  14.   
  15. [   27.374464] has_wake_lock_locked: main  
  16.   
  17. [   27.378199] wake_unlock: has_lock -1, tyep 0   
  18.   
  19. [   27.392930] wake_lock: PowerManagerService, type 0  
  20.   
  21. [   27.393956] wake_unlock: alarm  
  22.   
  23. [   27.395151] has_wake_lock_locked: PowerManagerService  
  24.   
  25. [   27.400186] wake_unlock: has_lock -1, tyep 0   
  26.   
  27. [   27.411910] wake_lock: PowerManagerService, type 0  
  28.   
  29. [   27.501326] wake_unlock: PowerManagerService  
  30.   
  31. [   27.501486] has_wake_lock_locked: main  
  32.   
  33. [   27.503730] wake_unlock: has_lock -1, tyep 0   
  34.   
  35. [   29.256685] CPU3: Booted secondary processor  
  36.   
  37. [   29.260032] Switched to NOHz mode on CPU #3  
  38.   
  39. [   37.367993] request_suspend_state: sleep (0->3) at 37367977812 (2000-01-01 00:00:34.101229642 UTC)  
  40.   
  41. [   37.371350] early_suspend: call handlers  
  42.   
  43. [   37.375256] wake_lock: PowerManagerService, type 0  
  44.   
  45. [   37.380051] early_suspend: calling stop_drawing_early_suspend  
  46.   
  47. [   37.381648] wake_lock: PowerManagerService, type 0  
  48.   
  49. [   37.415122] early_suspend: calling s5p_tvout_early_suspend  
  50.   
  51. [   37.415227] early_suspend: calling s3cfb_early_suspend  
  52.   
  53. [   37.425030] s3cfb_early_suspend is called  
  54.   
  55. [   37.425180] early_suspend: sync  
  56.   
  57. [   37.440326] wake_unlock: main  
  58.   
  59. [   37.440386] has_wake_lock_locked: PowerManagerService  
  60.   
  61. [   37.442688] wake_unlock: has_lock -1, tyep 0   
  62.   
  63. [   37.447026] active wake lock PowerManagerService  
  64.   
  65. [   37.451627] wake lock mmc0_detect, expired  
  66.   
  67. [   37.455720] wake lock mmc1_detect, expired  
  68.   
  69. [   37.459796] wake lock mmc2_detect, expired  
  70.   
  71. [   37.570189] wake_lock: PowerManagerService, type 0  
  72.   
  73. [   37.578657] wake_unlock: PowerManagerService  
  74.   
  75. [   37.578737] expired wake lock mmc0_detect  
  76.   
  77. [   37.581285] expired wake lock mmc1_detect  
  78.   
  79. [   37.585271] expired wake lock mmc2_detect  
  80.   
  81. [   37.589263] wake_unlock: has_lock 0, tyep 0   
  82.   
  83. [   37.596502] suspend: enter suspend  
  84.   
  85. [   37.596905] enter_state ...   
  86.   
  87. [   37.599618] PM: Syncing filesystems ... done.  
  88.   
  89. [   37.628488] PM: Preparing system for mem sleep  
  90.   
  91. [   37.629053] Freezing user space processes ... (elapsed 0.01 seconds) done.  
  92.   
  93. [   37.650108] Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.  
  94.   
  95. [   37.665185] PM: Entering mem sleep  
  96.   
  97. [   37.670152] [zsb] wm8994_set_bias_level: 0  
  98.   
  99. [   37.680752] gpio_switch_suspend dev 0xc06b7848,data 0xe008dd80   
  100.   
  101. [   37.681104] ====================================kevin:Powering off wifi  
  102.   
  103. [   37.692562] s5p-ohci s5p-ohci: still being used  
  104.   
  105. func s3c_irq_wake line 43 bit 6c state 1  
  106.   
  107. [   37.701327] PM: suspend of devices complete after 35.431 msecs  
  108.   
  109. [   37.701592] PM: suspend devices took 0.035 seconds  
  110.   
  111. [   37.706577] power_suspend_late return 0  
  112.   
  113. [   37.710202] PM: late suspend of devices complete after 3.821 msecs  
  114.   
  115. [   37.716358] Disabling non-boot CPUs ...  
  116.   
  117. [   37.720521] CPU3: shutdown  
  118.   
  119. exynos4_pm_suspend   
  120.   
  121. saved f8810000 value 00000001  
  122.   
  123. saved f8810004 value 000000f0  
  124.   
  125. saved f8810008 value 00000000  
  126.   
  127. saved f8820000 value 00000001  
  128.   
  129. saved f8820004 value 0000fc64  
  130.   
  131. saved f8820100 value 1000ffff  
  132.   
  133. saved f8820104 value ffffffff  
  134.   
  135. saved f8820108 value 5ef31bfd  
  136.   
  137. saved f8820300 value 00000000  
  138.   
  139. saved f8820304 value 00000000  
  140.   
  141. saved f8820308 value 00000000  
  142.   
  143. saved f8820400 value a0a0a0a0  
  144.   
  145. saved f8820404 value a0a0a0a0  
  146.   
  147. saved f8820408 value a0a0a0a0  
  148.   
  149. saved f882040c value a0a0a0a0  
  150.   
  151. saved f8820410 value a0a0a0a0  
  152.   
  153. saved f8820414 value a0a0a0a0  
  154.   
  155. saved f8820418 value a0a0a0a0  
  156.   
  157. saved f882041c value a0a0a0a0  
  158.   
  159. saved f8820420 value a0a0a0a0  
  160.   
  161. saved f8820424 value a0a0a0a0  
  162.   
  163. saved f8820428 value a0a0a0a0  
  164.   
  165. saved f882042c value a0a0a0a0  
  166.   
  167. saved f8820430 value a0a0a0a0  
  168.   
  169. saved f8820434 value a0a0a0a0  
  170.   
  171. saved f8820438 value a0a0a0a0  
  172.   
  173. saved f882043c value a0a0a0a0  
  174.   
  175. saved f8820440 value a0a0a0a0  
  176.   
  177. saved f8820444 value a0a0a0a0  
  178.   
  179. saved f8820448 value a0a0a0a0  
  180.   
  181. saved f882044c value a0a0a0a0  
  182.   
  183. saved f8820450 value a0a0a0a0  
  184.   
  185. saved f8820454 value a0a0a0a0  
  186.   
  187. saved f8820458 value a0a0a0a0  
  188.   
  189. saved f882045c value a0a0a0a0  
  190.   
  191. saved f8820460 value a0a0a0a0  
  192.   
  193. saved f8820464 value a0a0a0a0  
  194.   
  195. saved f8820468 value a0a0a0a0  
  196.   
  197. saved f882046c value a0a0a0a0  
  198.   
  199. saved f8820470 value a0a0a0a0  
  200.   
  201. saved f8820474 value a0a0a0a0  
  202.   
  203. saved f8820478 value a0a0a0a0  
  204.   
  205. saved f882047c value a0a0a0a0  
  206.   
  207. saved f8820480 value a0a0a0a0  
  208.   
  209. saved f8820484 value a0a0a0a0  
  210.   
  211. saved f8820488 value a0a0a0a0  
  212.   
  213. saved f882048c value a0a0a0a0  
  214.   
  215. saved f8820490 value a0a0a0a0  
  216.   
  217. saved f8820494 value a0a0a0a0  
  218.   
  219. saved f8820498 value a0a0a0a0  
  220.   
  221. saved f882049c value a0a0a0a0  
  222.   
  223. saved f8820800 value 01010101  
  224.   
  225. saved f8820804 value 01010101  
  226.   
  227. saved f8820808 value 01010101  
  228.   
  229. saved f882080c value 01010101  
  230.   
  231. saved f8820810 value 01010101  
  232.   
  233. saved f8820814 value 01010101  
  234.   
  235. saved f8820818 value 01010101  
  236.   
  237. saved f882081c value 01010101  
  238.   
  239. saved f8820820 value 01010101  
  240.   
  241. saved f8820824 value 01010101  
  242.   
  243. saved f8820828 value 01010101  
  244.   
  245. saved f882082c value 01010101  
  246.   
  247. saved f8820830 value 01010101  
  248.   
  249. saved f8820834 value 01010101  
  250.   
  251. saved f8820838 value 01010101  
  252.   
  253. saved f882083c value 01010101  
  254.   
  255. saved f8820840 value 01010101  
  256.   
  257. saved f8820844 value 01010101  
  258.   
  259. saved f8820848 value 01010101  
  260.   
  261. saved f882084c value 01010101  
  262.   
  263. saved f8820850 value 01010101  
  264.   
  265. saved f8820854 value 01010101  
  266.   
  267. saved f8820858 value 01010101  
  268.   
  269. saved f882085c value 01010101  
  270.   
  271. saved f8820860 value 01010101  
  272.   
  273. saved f8820864 value 01010101  
  274.   
  275. saved f8820868 value 01010101  
  276.   
  277. saved f882086c value 01010101  
  278.   
  279. saved f8820870 value 01010101  
  280.   
  281. saved f8820874 value 01010101  
  282.   
  283. saved f8820878 value 01010101  
  284.   
  285. saved f882087c value 01010101  
  286.   
  287. saved f8820880 value 01010101  
  288.   
  289. saved f8820884 value 01010101  
  290.   
  291. saved f8820888 value 01010101  
  292.   
  293. saved f882088c value 01010101  
  294.   
  295. saved f8820890 value 01010101  
  296.   
  297. saved f8820894 value 01010101  
  298.   
  299. saved f8820898 value 01010101  
  300.   
  301. saved f882089c value 01010101  
  302.   
  303. saved f8820c00 value aaaaaaaa  
  304.   
  305. saved f8820c04 value 7dd55fff  
  306.   
  307. saved f8820c08 value 55555555  
  308.   
  309. saved f8820c0c value 55555555  
  310.   
  311. saved f8820c10 value 55555555  
  312.   
  313. saved f8820c14 value 55555555  
  314.   
  315. saved f8820c18 value 55555555  
  316.   
  317. saved f8820c1c value 55555555  
  318.   
  319. saved f8820c20 value 55555555  
  320.   
  321. saved f8820c24 value 55555555  
  322.   
  323. saved f8700000 value 00100000  
  324.   
  325. saved f8700010 value 000070fc  
  326.   
  327. saved f8700020 value 02080000  
  328.   
  329. saved f8700030 value 00000000  
  330.   
  331. saved f8600108 value 00000110  
  332.   
  333. saved f860010c value 00000120  
  334.   
  335. saved f8600f60 value 71000007  
  336.   
  337. saved f8600f80 value 00000003  
  338.   
  339. saved f8600104 value 7e470001  
  340.   
  341. saved f810c320 value 11111111  
  342.   
  343. saved f810c324 value 00000010  
  344.   
  345. saved f810c334 value 00001110  
  346.   
  347. saved f810c33c value 00000001  
  348.   
  349. saved f810c340 value 01011111  
  350.   
  351. saved f810c350 value 00011111  
  352.   
  353. saved f810c354 value 01110111  
  354.   
  355. saved f8110300 value 00010000  
  356.   
  357. saved f8104800 value ffffffff  
  358.   
  359. saved f8108800 value ffffffff  
  360.   
  361. saved f810c820 value ffffffff  
  362.   
  363. saved f810c920 value fff8f000  
  364.   
  365. saved f810c924 value ffffffc4  
  366.   
  367. saved f810c928 value ffffffe0  
  368.   
  369. saved f810c92c value fffffffd  
  370.   
  371. saved f810c934 value ffffffc6  
  372.   
  373. saved f810c940 value fffc4b8c  
  374.   
  375. saved f810c94c value ffffffff  
  376.   
  377. saved f810c950 value f0088032  
  378.   
  379. saved f810c970 value ffffffff  
  380.   
  381. saved f8110900 value fe7fefff  
  382.   
  383. saved f8114800 value ffffffff  
  384.   
  385. saved f8114900 value ffffffff  
  386.   
  387. saved f8104500 value 00000013  
  388.   
  389. saved f8108500 value 00000013  
  390.   
  391. saved f810c520 value ffff4444  
  392.   
  393. saved f810c524 value 00000000  
  394.   
  395. saved f810c528 value 00000003  
  396.   
  397. saved f810c52c value 00000000  
  398.   
  399. saved f810c534 value 00fffff0  
  400.   
  401. saved f810c53c value 00000000  
  402.   
  403. saved f810c540 value 00f00000  
  404.   
  405. saved f810c544 value 00070007  
  406.   
  407. saved f810c548 value 01070107  
  408.   
  409. saved f810c54c value 00000100  
  410.   
  411. saved f810c550 value 00077777  
  412.   
  413. saved f810c554 value 09010907  
  414.   
  415. saved f810c558 value 00000907  
  416.   
  417. saved f810c55c value 000000f0  
  418.   
  419. saved f810c560 value 00000000  
  420.   
  421. saved f810c564 value 00000000  
  422.   
  423. saved f810c510 value 01215474  
  424.   
  425. saved f810c210 value 00000110  
  426.   
  427. saved f810c214 value 00011000  
  428.   
  429. saved f810c220 value 11116666  
  430.   
  431. saved f810c228 value 00000000  
  432.   
  433. saved f810c234 value 00001116  
  434.   
  435. saved f810c23c value 00000007  
  436.   
  437. saved f810c240 value 00066666  
  438.   
  439. saved f810c250 value 00066666  
  440.   
  441. saved f810c254 value 01610077  
  442.   
  443. saved f8110200 value 00011000  
  444.   
  445. saved f8114200 value 01000001  
  446.   
  447. saved f810c110 value a0400203  
  448.   
  449. saved f810c114 value 66010000  
  450.   
  451. saved f810c120 value a0850302  
  452.   
  453. saved f810c124 value 66010000  
  454.   
  455. saved f8111094 value 00000001  
  456.   
  457. saved f810c938 value fffffff0  
  458.   
  459. saved f8110904 value ffffffff  
  460.   
  461. saved f8104930 value fffffecb  
  462.   
  463. saved f8108960 value fffef7ff  
  464.   
  465. saved f8104700 value ffffffff  
  466.   
  467. saved f8104730 value ffffffff  
  468.   
  469. saved f8108700 value ffffffff  
  470.   
  471. saved f8108760 value ffffffff  
  472.   
  473. saved f810c750 value ffffffff  
  474.   
  475. saved f8110700 value ffffffff  
  476.   
  477. saved f8110704 value ffffffff  
  478.   
  479. saved f8110800 value ffffffff  
  480.   
  481. saved f810c568 value 00000003  
  482.   
  483. saved f810c538 value f0ff0fff  
  484.   
  485. saved f810c530 value 00000000  
  486.   
  487. saved f810c338 value 00001111  
  488.   
  489. saved f810c238 value 00001111  
  490.   
  491. saved f810c258 value 00000000  
  492.   
  493. saved f810c128 value 00000080  
  494.   
  495. saved f810c118 value 00000080  
  496.   
  497. s3c_pm_enter(3)  
  498.   
  499. GPA0: save 00000000,33222122,000000fa,0000f555  
  500.   
  501. GPA1: save 00000000,00222222,0000003f,00000555  
  502.   
  503. GPB: save 00000000,00000033,0000000f,0000555f  
  504.   
  505. GPC0: save 00000000,00001101,0000000d,000001f4  
  506.   
  507. GPC1: save 00000000,00000000,00000000,00000155  
  508.   
  509. GPD0: save 00000000,00003300,0000000c,000000f5  
  510.   
  511. GPD1: save 00000000,00002222,0000000f,000000ff  
  512.   
  513. GPF0: save 00000000,22222222,00000000,00000000  
  514.   
  515. GPF1: save 00000000,22222222,00000000,00000000  
  516.   
  517. GPF2: save 00000000,22222222,00000000,00000000  
  518.   
  519. GPF3: save 00000000,00112222,00000030,00000500  
  520.   
  521. GPK0: save 00000000,03333333,0000007e,00003ffc  
  522.   
  523. GPK1: save 00000000,04444000,0000007b,00003fc0  
  524.   
  525. GPK2: save 00000000,02222222,0000007a,00003ff0  
  526.   
  527. GPK3: save 00000000,02222122,0000007e,00003fc0  
  528.   
  529. GPL0: save 00000000,00000000,00000000,00001555  
  530.   
  531. GPL1: save 00000000,00000000,00000000,00000005  
  532.   
  533. GPL2: save 00000000,00001100,0000000c,00005545  
  534.   
  535. GPY0: save 00000000,00220020,0000003f,00000fff  
  536.   
  537. GPY1: save 00000000,00002222,00000007,000000ff  
  538.   
  539. GPY2: save 00000000,00000000,0000003f,00000fff  
  540.   
  541. GPY3: save 00000000,22222222,00000000,0000ffff  
  542.   
  543. GPY4: save 00000000,00000000,00000003,00005555  
  544.   
  545. GPY5: save 00000000,22222222,000000ff,0000ffff  
  546.   
  547. GPY6: save 00000000,22222222,000000ff,0000ffff  
  548.   
  549. GPX0: save 00000000,00f0000f,00000084,00005555  
  550.   
  551. GPX1: save 00000000,00003333,000000f0,00005500  
  552.   
  553. GPX2: save 00000000,00333333,000000ff,00005fff  
  554.   
  555. GPX3: save 00000000,f30f1f10,0000005d,00004435  
  556.   
  557. GPZ: save 00000000,02222222,00000005,00001555  
  558.   
  559. GPJ0: save 00000000,22222222,000000ff,00000000  
  560.   
  561. GPJ1: save 00000000,00022222,00000017,00000000  
  562.   
  563. GPM0: save 00000000,33333333,000000ff,00000000  
  564.   
  565. GPM1: save 00000000,00100033,00000023,00001150  
  566.   
  567. GPM2: save 00000000,00000333,00000003,00000140  
  568.   
  569. GPM3: save 00000000,00010002,00000010,00005555  
  570.   
  571. GPM4: save 00000000,00000000,0000000f,00005555  
  572.   
  573. UART[0]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0000  
  574.   
  575. UART[1]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0035  
  576.   
  577. UART[2]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0000  
  578.   
  579. UART[3]: ULCON=0003, UCON=03c5, UFCON=0111, UBRDIV=0000  
  580.   
  581. s3c_pm_check_resume_pin 352 (pin 190)   
  582.   
  583. s3c_pm_check_resume_pin 352 (pin 190) irqstate 00000001 pinstate ffffffff  
  584.   
  585. Disabling IRQ 352 (pin 190)  
  586.   
  587. s3c_pm_check_resume_pin 352 (pin 190)   
  588.   
  589. s3c_pm_check_resume_pin 353 (pin 191)   
  590.   
  591. s3c_pm_check_resume_pin 353 (pin 191) irqstate 00000002 pinstate ffffffff  
  592.   
  593. Disabling IRQ 353 (pin 191)  
  594.   
  595. s3c_pm_check_resume_pin 353 (pin 191)   
  596.   
  597. s3c_pm_check_resume_pin 354 (pin 192)   
  598.   
  599. s3c_pm_check_resume_pin 354 (pin 192) irqstate 00000004 pinstate ffffffff  
  600.   
  601. Disabling IRQ 354 (pin 192)  
  602.   
  603. s3c_pm_check_resume_pin 354 (pin 192)   
  604.   
  605. s3c_pm_check_resume_pin 355 (pin 193)   
  606.   
  607. s3c_pm_check_resume_pin 355 (pin 193) irqstate 00000008 pinstate ffffffff  
  608.   
  609. Disabling IRQ 355 (pin 193)  
  610.   
  611. s3c_pm_check_resume_pin 355 (pin 193)   
  612.   
  613. s3c_pm_check_resume_pin 356 (pin 194)   
  614.   
  615. s3c_pm_check_resume_pin 356 (pin 194) irqstate 00000010 pinstate ffffffff  
  616.   
  617. Disabling IRQ 356 (pin 194)  
  618.   
  619. s3c_pm_check_resume_pin 356 (pin 194)   
  620.   
  621. s3c_pm_check_resume_pin 357 (pin 195)   
  622.   
  623. s3c_pm_check_resume_pin 357 (pin 195) irqstate 00000020 pinstate ffffffff  
  624.   
  625. Disabling IRQ 357 (pin 195)  
  626.   
  627. s3c_pm_check_resume_pin 357 (pin 195)   
  628.   
  629. s3c_pm_check_resume_pin 358 (pin 196)   
  630.   
  631. s3c_pm_check_resume_pin 358 (pin 196) irqstate 00000040 pinstate ffffffff  
  632.   
  633. Disabling IRQ 358 (pin 196)  
  634.   
  635. s3c_pm_check_resume_pin 358 (pin 196)   
  636.   
  637. s3c_pm_check_resume_pin 359 (pin 197)   
  638.   
  639. s3c_pm_check_resume_pin 359 (pin 197) irqstate 00000080 pinstate ffffffff  
  640.   
  641. Disabling IRQ 359 (pin 197)  
  642.   
  643. s3c_pm_check_resume_pin 359 (pin 197)   
  644.   
  645. s3c_pm_check_resume_pin 360 (pin 199)   
  646.   
  647. s3c_pm_check_resume_pin 360 (pin 199) irqstate 00000100 pinstate ffffffff  
  648.   
  649. Disabling IRQ 360 (pin 199)  
  650.   
  651. s3c_pm_check_resume_pin 360 (pin 199)   
  652.   
  653. s3c_pm_check_resume_pin 361 (pin 200)   
  654.   
  655. s3c_pm_check_resume_pin 361 (pin 200) irqstate 00000200 pinstate ffffffff  
  656.   
  657. Disabling IRQ 361 (pin 200)  
  658.   
  659. s3c_pm_check_resume_pin 361 (pin 200)   
  660.   
  661. s3c_pm_check_resume_pin 362 (pin 201)   
  662.   
  663. s3c_pm_check_resume_pin 362 (pin 201) irqstate 00000400 pinstate ffffffff  
  664.   
  665. Disabling IRQ 362 (pin 201)  
  666.   
  667. s3c_pm_check_resume_pin 362 (pin 201)   
  668.   
  669. s3c_pm_check_resume_pin 363 (pin 202)   
  670.   
  671. s3c_pm_check_resume_pin 363 (pin 202) irqstate 00000800 pinstate ffffffff  
  672.   
  673. Disabling IRQ 363 (pin 202)  
  674.   
  675. s3c_pm_check_resume_pin 363 (pin 202)   
  676.   
  677. s3c_pm_check_resume_pin 364 (pin 203)   
  678.   
  679. s3c_pm_check_resume_pin 364 (pin 203) irqstate 00000000 pinstate ffffffff  
  680.   
  681. Leaving IRQ 364 (pin 203) as is  
  682.   
  683. func s3c_irqext_wake line 147 bit 1000 state 1   
  684.   
  685. [   38.620024] wake enabled for irq 364  
  686.   
  687. s3c_pm_check_resume_pin 364 (pin 203)   
  688.   
  689. s3c_pm_check_resume_pin 365 (pin 204)   
  690.   
  691. s3c_pm_check_resume_pin 365 (pin 204) irqstate 00002000 pinstate ffffffff  
  692.   
  693. Disabling IRQ 365 (pin 204)  
  694.   
  695. s3c_pm_check_resume_pin 365 (pin 204)   
  696.   
  697. s3c_pm_check_resume_pin 366 (pin 205)   
  698.   
  699. s3c_pm_check_resume_pin 366 (pin 205) irqstate 00004000 pinstate ffffffff  
  700.   
  701. Disabling IRQ 366 (pin 205)  
  702.   
  703. s3c_pm_check_resume_pin 366 (pin 205)   
  704.   
  705. s3c_pm_check_resume_pin 367 (pin 206)   
  706.   
  707. s3c_pm_check_resume_pin 367 (pin 206) irqstate 00008000 pinstate ffffffff  
  708.   
  709. Disabling IRQ 367 (pin 206)  
  710.   
  711. s3c_pm_check_resume_pin 367 (pin 206)   
  712.   
  713. s3c_pm_check_resume_pin 368 (pin 208)   
  714.   
  715. s3c_pm_check_resume_pin 368 (pin 208) irqstate 00010000 pinstate ffffffff  
  716.   
  717. Disabling IRQ 368 (pin 208)  
  718.   
  719. s3c_pm_check_resume_pin 368 (pin 208)   
  720.   
  721. s3c_pm_check_resume_pin 369 (pin 209)   
  722.   
  723. s3c_pm_check_resume_pin 369 (pin 209) irqstate 00020000 pinstate ffffffff  
  724.   
  725. Disabling IRQ 369 (pin 209)  
  726.   
  727. s3c_pm_check_resume_pin 369 (pin 209)   
  728.   
  729. s3c_pm_check_resume_pin 370 (pin 210)   
  730.   
  731. s3c_pm_check_resume_pin 370 (pin 210) irqstate 00040000 pinstate ffffffff  
  732.   
  733. Disabling IRQ 370 (pin 210)  
  734.   
  735. s3c_pm_check_resume_pin 370 (pin 210)   
  736.   
  737. s3c_pm_check_resume_pin 371 (pin 211)   
  738.   
  739. s3c_pm_check_resume_pin 371 (pin 211) irqstate 00080000 pinstate ffffffff  
  740.   
  741. Disabling IRQ 371 (pin 211)  
  742.   
  743. s3c_pm_check_resume_pin 371 (pin 211)   
  744.   
  745. s3c_pm_check_resume_pin 372 (pin 212)   
  746.   
  747. s3c_pm_check_resume_pin 372 (pin 212) irqstate 00100000 pinstate ffffffff  
  748.   
  749. Disabling IRQ 372 (pin 212)  
  750.   
  751. s3c_pm_check_resume_pin 372 (pin 212)   
  752.   
  753. s3c_pm_check_resume_pin 373 (pin 213)   
  754.   
  755. s3c_pm_check_resume_pin 373 (pin 213) irqstate 00200000 pinstate ffffffff  
  756.   
  757. Disabling IRQ 373 (pin 213)  
  758.   
  759. s3c_pm_check_resume_pin 373 (pin 213)   
  760.   
  761. s3c_pm_check_resume_pin 374 (pin 214)   
  762.   
  763. s3c_pm_check_resume_pin 374 (pin 214) irqstate 00400000 pinstate ffffffff  
  764.   
  765. Disabling IRQ 374 (pin 214)  
  766.   
  767. s3c_pm_check_resume_pin 374 (pin 214)   
  768.   
  769. s3c_pm_check_resume_pin 375 (pin 215)   
  770.   
  771. s3c_pm_check_resume_pin 375 (pin 215) irqstate 00800000 pinstate ffffffff  
  772.   
  773. Disabling IRQ 375 (pin 215)  
  774.   
  775. s3c_pm_check_resume_pin 375 (pin 215)   
  776.   
  777. s3c_pm_check_resume_pin 376 (pin 217)   
  778.   
  779. s3c_pm_check_resume_pin 376 (pin 217) irqstate 01000000 pinstate ffffffff  
  780.   
  781. Disabling IRQ 376 (pin 217)  
  782.   
  783. s3c_pm_check_resume_pin 376 (pin 217)   
  784.   
  785. s3c_pm_check_resume_pin 377 (pin 218)   
  786.   
  787. s3c_pm_check_resume_pin 377 (pin 218) irqstate 02000000 pinstate ffffffff  
  788.   
  789. Disabling IRQ 377 (pin 218)  
  790.   
  791. s3c_pm_check_resume_pin 377 (pin 218)   
  792.   
  793. s3c_pm_check_resume_pin 378 (pin 219)   
  794.   
  795. s3c_pm_check_resume_pin 378 (pin 219) irqstate 04000000 pinstate ffffffff  
  796.   
  797. Disabling IRQ 378 (pin 219)  
  798.   
  799. s3c_pm_check_resume_pin 378 (pin 219)   
  800.   
  801. s3c_pm_check_resume_pin 379 (pin 220)   
  802.   
  803. s3c_pm_check_resume_pin 379 (pin 220) irqstate 08000000 pinstate ffffffff  
  804.   
  805. Disabling IRQ 379 (pin 220)  
  806.   
  807. s3c_pm_check_resume_pin 379 (pin 220)   
  808.   
  809. s3c_pm_check_resume_pin 380 (pin 221)   
  810.   
  811. s3c_pm_check_resume_pin 380 (pin 221) irqstate 00000000 pinstate ffffffff  
  812.   
  813. Leaving IRQ 380 (pin 221) as is  
  814.   
  815. s3c_pm_check_resume_pin 380 (pin 221)   
  816.   
  817. s3c_pm_check_resume_pin 381 (pin 222)   
  818.   
  819. s3c_pm_check_resume_pin 381 (pin 222) irqstate 20000000 pinstate ffffffff  
  820.   
  821. Disabling IRQ 381 (pin 222)  
  822.   
  823. s3c_pm_check_resume_pin 381 (pin 222)   
  824.   
  825. s3c_pm_check_resume_pin 382 (pin 223)   
  826.   
  827. s3c_pm_check_resume_pin 382 (pin 223) irqstate 40000000 pinstate ffffffff  
  828.   
  829. Disabling IRQ 382 (pin 223)  
  830.   
  831. s3c_pm_check_resume_pin 382 (pin 223)   
  832.   
  833. s3c_pm_check_resume_pin 383 (pin 224)   
  834.   
  835. s3c_pm_check_resume_pin 383 (pin 224) irqstate 80000000 pinstate ffffffff  
  836.   
  837. Disabling IRQ 383 (pin 224)  
  838.   
  839. s3c_pm_check_resume_pin 383 (pin 224)   
  840.   
  841. sleep: irq wakeup masks: ffffffc0,efffefff  
  842.   
  843. func s3c_pm_enter line 295  
  844.   
  845. [   38.937146] exynos4_pm_prepare   
  846.   
  847. REG_INFORM0 0xf8180800, value 0x4005b718   
  848.   
  849. REG_INFORM1 0xf8180804, value 0xabad0000   
  850.   
  851. REG_INFORM2 0xf8180808, value 0xabad0000   
  852.   
  853. REG_INFORM3 0xf818080c, value 0x00000007   
  854.   
  855. func s3c_pm_enter line 300  
  856.   
  857. func s3c_pm_enter line 304  
  858.   
  859. func s3c_pm_enter line 307  
  860.   
  861. SWRESET = 0x00000000   
  862.   
  863. RST_STAT = 0x00010000   
  864.   
  865. CLK_DIV_G3D = 0x00000000   
  866.   
  867. EINT_WAKEUP_MASK = 0xefffefff   
  868.   
  869. WAKEUP_MASK = 0x0000ff00   
  870.   
  871. WAKEUP_STAT = 0x00000000   
  872.   
  873. GPX0CON = 0x00000000 0x00000084 0x00005555 0x00000000   
  874.   
  875. CENTRAL_SEQ_CONFIGURATION = 0x00000000   
  876.   
  877. CENTRAL_SEQ_OPTION = 0x01010000   
  878.   
  879. CENTRAL_SEQ_CONFIGURATION_COREBLK = 0x00010000   
  880.   
  881. C2C_CTRL = 0x00000000   
  882.   
  883. func s3c_pm_enter line 328  
  884.   
  885.   
  886.   
  887.  s3c_cpu_save5   
  888.   
  889. exynos4_cpu_suspend   
  890.   
  891.   
  892.   
  893. c0534ac8   
  894.   
  895. [   37.724089] Enabling non-boot CPUs ...  
  896.   
  897. [   37.735537] CPU3: Booted secondary processor  
  898.   
  899. [   37.736038] CPU3 is up  
  900.   
  901. [   37.737172] PM: early resume of devices complete after 0.165 msecs  
  902.   
  903. [   37.740026] Switched to NOHz mode on CPU #3  
  904.   
  905. [   37.747360] SysRq : HELP : loglevel(0-9) reBoot Crash terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) thaw-filesystems(J) show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) Sync show-task-states(T) Unmount show-blocked-tasks(W)   
  906.   
  907. [   37.775200] SysRq : HELP : loglevel(0-9) reBoot Crash terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) thaw-filesystems(J) show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) Sync show-task-states(T) Unmount show-blocked-tasks(W)   
  908.   
  909. [   37.803351] s3c2410-wdt: watchdog disabled  
  910. f[   37.807175] s3c-rtc s3c64xx-rtc: rtc disabled, re-enabling  
  911.   
  912. unc s3c_irq_wake line 43 bit 6c state 0  
  913.   
  914. [   37.821907] usb_hub_gpio_init()**************/n  

你可能感兴趣的:(android power manager 之 suspend resume过程)