1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * wakeup.c - support wakeup devices 4 * Copyright (C) 2004 Li Shaohua <shaohua.li@intel.com> 5 */ 6 7 #include <linux/init.h> 8 #include <linux/acpi.h> 9 #include <linux/kernel.h> 10 #include <linux/types.h> 11 12 #include "internal.h" 13 #include "sleep.h" 14 15 /* 16 * We didn't lock acpi_device_lock in the file, because it invokes oops in 17 * suspend/resume and isn't really required as this is called in S-state. At 18 * that time, there is no device hotplug 19 **/ 20 #define _COMPONENT ACPI_SYSTEM_COMPONENT 21 ACPI_MODULE_NAME("wakeup_devices") 22 23 /** 24 * acpi_enable_wakeup_devices - Enable wake-up device GPEs. 25 * @sleep_state: ACPI system sleep state. 26 * 27 * Enable wakeup device power of devices with the state.enable flag set and set 28 * the wakeup enable mask bits in the GPE registers that correspond to wakeup 29 * devices. 30 */ 31 void acpi_enable_wakeup_devices(u8 sleep_state) 32 { 33 struct acpi_device *dev, *tmp; 34 35 list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list, 36 wakeup_list) { 37 if (!dev->wakeup.flags.valid 38 || sleep_state > (u32) dev->wakeup.sleep_state 39 || !(device_may_wakeup(&dev->dev) 40 || dev->wakeup.prepare_count)) 41 continue; 42 43 if (device_may_wakeup(&dev->dev)) 44 acpi_enable_wakeup_device_power(dev, sleep_state); 45 46 /* The wake-up power should have been enabled already. */ 47 acpi_set_gpe_wake_mask(dev->wakeup.gpe_device, dev->wakeup.gpe_number, 48 ACPI_GPE_ENABLE); 49 } 50 } 51 52 /** 53 * acpi_disable_wakeup_devices - Disable devices' wakeup capability. 54 * @sleep_state: ACPI system sleep state. 55 */ 56 void acpi_disable_wakeup_devices(u8 sleep_state) 57 { 58 struct acpi_device *dev, *tmp; 59 60 list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list, 61 wakeup_list) { 62 if (!dev->wakeup.flags.valid 63 || sleep_state > (u32) dev->wakeup.sleep_state 64 || !(device_may_wakeup(&dev->dev) 65 || dev->wakeup.prepare_count)) 66 continue; 67 68 acpi_set_gpe_wake_mask(dev->wakeup.gpe_device, dev->wakeup.gpe_number, 69 ACPI_GPE_DISABLE); 70 71 if (device_may_wakeup(&dev->dev)) 72 acpi_disable_wakeup_device_power(dev); 73 } 74 } 75 76 int __init acpi_wakeup_device_init(void) 77 { 78 struct acpi_device *dev, *tmp; 79 80 mutex_lock(&acpi_device_lock); 81 list_for_each_entry_safe(dev, tmp, &acpi_wakeup_device_list, 82 wakeup_list) { 83 if (device_can_wakeup(&dev->dev)) { 84 /* Button GPEs are supposed to be always enabled. */ 85 acpi_enable_gpe(dev->wakeup.gpe_device, 86 dev->wakeup.gpe_number); 87 device_set_wakeup_enable(&dev->dev, true); 88 } 89 } 90 mutex_unlock(&acpi_device_lock); 91 return 0; 92 } 93