/** * acpi_device_wakeup - Enable/disable wakeup functionality for device. * @adev: ACPI device to enable/disable wakeup functionality for. * @target_state: State the system is transitioning into. * @enable: Whether to enable or disable the wakeup functionality. * * Enable/disable the GPE associated with @adev so that it can generate * wakeup signals for the device in response to external (remote) events and * enable/disable device wakeup power. * * Callers must ensure that @adev is a valid ACPI device node before executing * this function. */ static int acpi_device_wakeup(struct acpi_device *adev, u32 target_state, bool enable) { struct acpi_device_wakeup *wakeup = &adev->wakeup; if (enable) { acpi_status res; int error; error = acpi_enable_wakeup_device_power(adev, target_state); if (error) return error; if (adev->wakeup.flags.enabled) return 0; res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number); if (ACPI_SUCCESS(res)) { adev->wakeup.flags.enabled = 1; } else { acpi_disable_wakeup_device_power(adev); return -EIO; } } else { if (adev->wakeup.flags.enabled) { acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number); adev->wakeup.flags.enabled = 0; } acpi_disable_wakeup_device_power(adev); } return 0; }
/** * __acpi_device_sleep_wake - Enable or disable device to wake up the system. * @dev: Device to enable/desible to wake up the system. * @target_state: System state the device is supposed to wake up from. * @enable: Whether to enable or disable @dev to wake up the system. */ int __acpi_device_sleep_wake(struct acpi_device *adev, u32 target_state, bool enable) { return enable ? acpi_enable_wakeup_device_power(adev, target_state) : acpi_disable_wakeup_device_power(adev); }
/** * __acpi_device_run_wake - Enable/disable runtime remote wakeup for device. * @adev: ACPI device to enable/disable the remote wakeup for. * @enable: Whether to enable or disable the wakeup functionality. * * Enable/disable the GPE associated with @adev so that it can generate * wakeup signals for the device in response to external (remote) events and * enable/disable device wakeup power. * * Callers must ensure that @adev is a valid ACPI device node before executing * this function. */ int __acpi_device_run_wake(struct acpi_device *adev, bool enable) { struct acpi_device_wakeup *wakeup = &adev->wakeup; if (enable) { acpi_status res; int error; error = acpi_enable_wakeup_device_power(adev, ACPI_STATE_S0); if (error) return error; res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number); if (ACPI_FAILURE(res)) { acpi_disable_wakeup_device_power(adev); return -EIO; } } else { acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number); acpi_disable_wakeup_device_power(adev); } return 0; }
/** * acpi_device_wakeup - Enable/disable wakeup functionality for device. * @adev: ACPI device to enable/disable wakeup functionality for. * @target_state: State the system is transitioning into. * @enable: Whether to enable or disable the wakeup functionality. * * Enable/disable the GPE associated with @adev so that it can generate * wakeup signals for the device in response to external (remote) events and * enable/disable device wakeup power. * * Callers must ensure that @adev is a valid ACPI device node before executing * this function. */ static int acpi_device_wakeup(struct acpi_device *adev, u32 target_state, bool enable) { struct acpi_device_wakeup *wakeup = &adev->wakeup; if (enable) { acpi_status res; int error; error = acpi_enable_wakeup_device_power(adev, target_state); if (error) return error; res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number); if (ACPI_FAILURE(res)) { acpi_disable_wakeup_device_power(adev); return -EIO; } } else { acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number); acpi_disable_wakeup_device_power(adev); } return 0; }