pm_drv.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #include <linux/config.h>
  2. #include <linux/pm.h>
  3. #include <linux/module.h>
  4. #include <asm/hardware.h>
  5. /* Debugging macros */
  6. #undef DEBUG_PMDRV
  7. #ifdef DEBUG_PMDRV
  8. #define DPRINTK(args...) printk(##args)
  9. #else
  10. #define DPRINTK(args...)
  11. #endif
  12. extern int pm_do_suspend(void);
  13. /* kernel/pm.c */
  14. extern int pm_send_all_type(pm_dev_t type, pm_request_t rqst, void *data);
  15. int 
  16. pm_sys_suspend(void)
  17. {
  18. int ret;
  19. DPRINTK("In "__FUNCTION__"n");
  20. event_notify(SYSTEM_SLEEP);
  21. #if 0
  22. ret = pm_send_all(PM_SUSPEND, (void *)2);
  23. if (ret) {
  24. pm_send_all(PM_RESUME, (void *)0);
  25. event_notify(SYSTEM_WAKEUP);
  26. return ret;
  27. }
  28. #else
  29. ret = pm_send_all_type(PM_DEBUG_DEV, PM_SUSPEND, (void *)2);
  30. if (ret) {
  31. pm_send_all_type(PM_DEBUG_DEV, PM_RESUME, (void *)0);
  32. event_notify(SYSTEM_WAKEUP);
  33. return ret;
  34. }
  35. #endif
  36. ret = pm_do_suspend();
  37. //pm_access(pm_dev);
  38. #if 0
  39. ret = pm_send_all_type(PM_USER_DEV, PM_RESUME, (void *)0);
  40. #else
  41. ret = pm_send_all_type(PM_DEBUG_DEV, PM_RESUME, (void *)0);
  42. if (ret) {
  43. printk("Warning. Somewrong while wakeup the system");
  44. }
  45. #endif
  46. event_notify(SYSTEM_WAKEUP);
  47. //run_sbin_pm_helper(PM_RESUME);
  48. return ret;
  49. }
  50. int
  51. pm_user_suspend(void)
  52. {
  53. DPRINTK("In "__FUNCTION__"n");
  54. //ret = pm_send_all_type(PM_USER_DEV, PM_SUSPEND, (void *)2);
  55. //ret = pm_send_target(PM_SYS_DEV, PM_SYS_PCMCIA, PM_SUSPEND, (void *)2);
  56. //
  57. pm_sys_suspend();
  58. //run_sbin_pm_helper(PM_SUSPEND);
  59. return 0;
  60. }
  61. EXPORT_SYMBOL(pm_user_suspend);
  62. static char pm_helper_path[128] = "/usr/sbin/pm_helper";
  63. extern int call_usermodehelper(char *path, char **argv, char **envp);
  64. #if 0 // not yet ?
  65. static void
  66. run_sbin_pm_helper(pm_request_t req)
  67. {
  68. int i;
  69. char *argv[3], *envp[8];
  70. if (!pm_helper_path[0])
  71. return;
  72. if (req != PM_SUSPEND && req != PM_RESUME)
  73. return;
  74. i = 0;
  75. argv[i++] = pm_helper_path;
  76. argv[i++] = (req == PM_RESUME ? "resume" : "suspend");
  77. argv[i] = 0;
  78. #if 0
  79. DPRITNK(__FUNCTION__":%d pm_helper_path=%sn", __LINE__,
  80. pm_helper_path);
  81. #endif
  82. i = 0;
  83. /* minimal command environment */
  84. envp[i++] = "HOME=/";
  85. envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
  86. envp[i] = 0;
  87. /* other stuff we want to pass to /sbin/pm_helper */
  88. call_usermodehelper(argv[0], argv, envp);
  89. }
  90. #endif /* not yet ? */