wakeup.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * wakeup.c - support wakeup devices
  3. * Copyright (C) 2004 Li Shaohua <shaohua.li@intel.com>
  4. */
  5. #include <linux/init.h>
  6. #include <linux/acpi.h>
  7. #include <acpi/acpi_drivers.h>
  8. #include <linux/kernel.h>
  9. #include <linux/types.h>
  10. #include <acpi/acevents.h>
  11. #include "sleep.h"
  12. #define _COMPONENT ACPI_SYSTEM_COMPONENT
  13. ACPI_MODULE_NAME("wakeup_devices")
  14. extern struct list_head acpi_wakeup_device_list;
  15. extern spinlock_t acpi_device_lock;
  16. /**
  17. * acpi_enable_wakeup_device_prep - prepare wakeup devices
  18. * @sleep_state: ACPI state
  19. * Enable all wakup devices power if the devices' wakeup level
  20. * is higher than requested sleep level
  21. */
  22. void acpi_enable_wakeup_device_prep(u8 sleep_state)
  23. {
  24. struct list_head *node, *next;
  25. spin_lock(&acpi_device_lock);
  26. list_for_each_safe(node, next, &acpi_wakeup_device_list) {
  27. struct acpi_device *dev = container_of(node,
  28. struct acpi_device,
  29. wakeup_list);
  30. if (!dev->wakeup.flags.valid ||
  31. !dev->wakeup.state.enabled ||
  32. (sleep_state > (u32) dev->wakeup.sleep_state))
  33. continue;
  34. spin_unlock(&acpi_device_lock);
  35. acpi_enable_wakeup_device_power(dev, sleep_state);
  36. spin_lock(&acpi_device_lock);
  37. }
  38. spin_unlock(&acpi_device_lock);
  39. }
  40. /**
  41. * acpi_enable_wakeup_device - enable wakeup devices
  42. * @sleep_state: ACPI state
  43. * Enable all wakup devices's GPE
  44. */
  45. void acpi_enable_wakeup_device(u8 sleep_state)
  46. {
  47. struct list_head *node, *next;
  48. /*
  49. * Caution: this routine must be invoked when interrupt is disabled
  50. * Refer ACPI2.0: P212
  51. */
  52. spin_lock(&acpi_device_lock);
  53. list_for_each_safe(node, next, &acpi_wakeup_device_list) {
  54. struct acpi_device *dev =
  55. container_of(node, struct acpi_device, wakeup_list);
  56. if (!dev->wakeup.flags.valid)
  57. continue;
  58. /* If users want to disable run-wake GPE,
  59. * we only disable it for wake and leave it for runtime
  60. */
  61. if ((!dev->wakeup.state.enabled && !dev->wakeup.flags.prepared)
  62. || sleep_state > (u32) dev->wakeup.sleep_state) {
  63. if (dev->wakeup.flags.run_wake) {
  64. spin_unlock(&acpi_device_lock);
  65. /* set_gpe_type will disable GPE, leave it like that */
  66. acpi_set_gpe_type(dev->wakeup.gpe_device,
  67. dev->wakeup.gpe_number,
  68. ACPI_GPE_TYPE_RUNTIME);
  69. spin_lock(&acpi_device_lock);
  70. }
  71. continue;
  72. }
  73. spin_unlock(&acpi_device_lock);
  74. if (!dev->wakeup.flags.run_wake)
  75. acpi_enable_gpe(dev->wakeup.gpe_device,
  76. dev->wakeup.gpe_number);
  77. spin_lock(&acpi_device_lock);
  78. }
  79. spin_unlock(&acpi_device_lock);
  80. }
  81. /**
  82. * acpi_disable_wakeup_device - disable devices' wakeup capability
  83. * @sleep_state: ACPI state
  84. * Disable all wakup devices's GPE and wakeup capability
  85. */
  86. void acpi_disable_wakeup_device(u8 sleep_state)
  87. {
  88. struct list_head *node, *next;
  89. spin_lock(&acpi_device_lock);
  90. list_for_each_safe(node, next, &acpi_wakeup_device_list) {
  91. struct acpi_device *dev =
  92. container_of(node, struct acpi_device, wakeup_list);
  93. if (!dev->wakeup.flags.valid)
  94. continue;
  95. if ((!dev->wakeup.state.enabled && !dev->wakeup.flags.prepared)
  96. || sleep_state > (u32) dev->wakeup.sleep_state) {
  97. if (dev->wakeup.flags.run_wake) {
  98. spin_unlock(&acpi_device_lock);
  99. acpi_set_gpe_type(dev->wakeup.gpe_device,
  100. dev->wakeup.gpe_number,
  101. ACPI_GPE_TYPE_WAKE_RUN);
  102. /* Re-enable it, since set_gpe_type will disable it */
  103. acpi_enable_gpe(dev->wakeup.gpe_device,
  104. dev->wakeup.gpe_number);
  105. spin_lock(&acpi_device_lock);
  106. }
  107. continue;
  108. }
  109. spin_unlock(&acpi_device_lock);
  110. acpi_disable_wakeup_device_power(dev);
  111. /* Never disable run-wake GPE */
  112. if (!dev->wakeup.flags.run_wake) {
  113. acpi_disable_gpe(dev->wakeup.gpe_device,
  114. dev->wakeup.gpe_number);
  115. acpi_clear_gpe(dev->wakeup.gpe_device,
  116. dev->wakeup.gpe_number, ACPI_NOT_ISR);
  117. }
  118. spin_lock(&acpi_device_lock);
  119. }
  120. spin_unlock(&acpi_device_lock);
  121. }
  122. static int __init acpi_wakeup_device_init(void)
  123. {
  124. struct list_head *node, *next;
  125. if (acpi_disabled)
  126. return 0;
  127. spin_lock(&acpi_device_lock);
  128. list_for_each_safe(node, next, &acpi_wakeup_device_list) {
  129. struct acpi_device *dev = container_of(node,
  130. struct acpi_device,
  131. wakeup_list);
  132. /* In case user doesn't load button driver */
  133. if (!dev->wakeup.flags.run_wake || dev->wakeup.state.enabled)
  134. continue;
  135. spin_unlock(&acpi_device_lock);
  136. acpi_set_gpe_type(dev->wakeup.gpe_device,
  137. dev->wakeup.gpe_number,
  138. ACPI_GPE_TYPE_WAKE_RUN);
  139. acpi_enable_gpe(dev->wakeup.gpe_device,
  140. dev->wakeup.gpe_number);
  141. dev->wakeup.state.enabled = 1;
  142. spin_lock(&acpi_device_lock);
  143. }
  144. spin_unlock(&acpi_device_lock);
  145. return 0;
  146. }
  147. late_initcall(acpi_wakeup_device_init);