int cros_ec_resume(struct cros_ec_device *ec_dev) { int ret; u8 sleep_event; ec_dev->suspended = false; enable_irq(ec_dev->irq); sleep_event = (!IS_ENABLED(CONFIG_ACPI) || pm_suspend_via_firmware()) ? HOST_SLEEP_EVENT_S3_RESUME : HOST_SLEEP_EVENT_S0IX_RESUME; ret = cros_ec_sleep_event(ec_dev, sleep_event); if (ret < 0) dev_dbg(ec_dev->dev, "Error %d sending resume event to ec", ret); if (ec_dev->wake_enabled) { disable_irq_wake(ec_dev->irq); ec_dev->wake_enabled = 0; } /* * Let the mfd devices know about events that occur during * suspend. This way the clients know what to do with them. */ cros_ec_report_events_during_suspend(ec_dev); return 0; }
int cros_ec_resume(struct cros_ec_device *ec_dev) { int ret; u8 sleep_event; ec_dev->suspended = false; enable_irq(ec_dev->irq); sleep_event = (!IS_ENABLED(CONFIG_ACPI) || pm_suspend_via_firmware()) ? HOST_SLEEP_EVENT_S3_RESUME : HOST_SLEEP_EVENT_S0IX_RESUME; ret = cros_ec_sleep_event(ec_dev, sleep_event); if (ret < 0) dev_dbg(ec_dev->dev, "Error %d sending resume event to ec", ret); /* * In some cases, we need to distinguish between events that occur * during suspend if the EC is not a wake source. For example, * keypresses during suspend should be discarded if it does not wake * the system. * * If the EC is not a wake source, drain the event queue and mark them * as "queued during suspend". */ if (ec_dev->wake_enabled) { disable_irq_wake(ec_dev->irq); ec_dev->wake_enabled = 0; } else { cros_ec_drain_events(ec_dev); } return 0; }
static int intel_hid_pl_suspend_handler(struct device *device) { if (pm_suspend_via_firmware()) { intel_hid_set_enable(device, false); intel_button_array_enable(device, false); } return 0; }
int cros_ec_suspend(struct cros_ec_device *ec_dev) { struct device *dev = ec_dev->dev; int ret; u8 sleep_event; sleep_event = (!IS_ENABLED(CONFIG_ACPI) || pm_suspend_via_firmware()) ? HOST_SLEEP_EVENT_S3_SUSPEND : HOST_SLEEP_EVENT_S0IX_SUSPEND; ret = cros_ec_sleep_event(ec_dev, sleep_event); if (ret < 0) dev_dbg(ec_dev->dev, "Error %d sending suspend event to ec", ret); if (device_may_wakeup(dev)) ec_dev->wake_enabled = !enable_irq_wake(ec_dev->irq); disable_irq(ec_dev->irq); ec_dev->was_wake_device = ec_dev->wake_enabled; ec_dev->suspended = true; return 0; }